[转]关于全排在景深排序中的应用

http://uh.9ria.com/space-12147-do-blog-id-4006.html

这点主要体现在多格物品的排序上。就我所知道的是,大于1x2格子的物品只采用单排的方式实现是不可能的,因为排序涉及到的两个物品的同样可能有顺序问题。这种情况要不就是将物品打散成1x2,要不就只能全部排序。

其实全排并不是什么可怕的事情,很多客户端游戏都是用的全排的方法。

关于排序方法,AS3自带的sort是原生的排序方法(看时间复杂度应该至少是快速排序法),在速度上有很大的优势,使用下面的代码就能让container容器下的对象完成按sortFunction的结果来进行排序(sortObjs数组应该保持着container容器下的所有子对象)
var result:Array = sortObjs.sort(sortFunction,Array.NUMERIC|Array.RETURNINDEXEDARRAY);
for (i = 0; i < result.length; i++)
{
     var v:DisplayObject = sortObjs[result[i]] as DisplayObject;
     if (container.getChildIndex(v) != i)
         container.setChildIndex(v,i);
}
function sortFunction(v1:*,v2:*):int
{
     return v1.y < v2.y ? 1 : v1.y > v2.y ? -1 : 0;
}
在数据量一般的情况下(100左右)消耗非常轻微,反而是setChildIndex操作比较耗时(因为会导致画面重绘),也就是说在不需要更改顺序的时候即使在ENTERFRAME里重复执行CPU占用也可以接受。

然后管理好排序列表,在屏幕外的物品就不排序,基本上全排倒也是可行的。毕竟同屏幕显示的物品很多的话,本身不排序性能也已经比较吃力了。


当然,能单排还是应该单排。其实全排处理的是无法直接用排序分值来进行排序的情况(也就是必须用sortFunction才能判断前后的情况),如果可以根据物品的属性直接计算出深度,那当然还是应该单排。而且最好把计算分值的操作独立出来,排序的时候直接用结果,这样可以避免重复计算分值。

你可能感兴趣的:(html,游戏,Blog)