RPG游戏中深度排序性能比较.
热33已有 1874 次阅读 2009-11-13 17:38结果如下:
性能从高到低:doSort4,doSort1,doSort3,doSort2,doSrot5
doSort1:先数组的sortOn排序,再用setChildIndex设置层.
doSort2:先数组的sortOn排序,再用swapChildren设置层,不设置没有变化的层.
doSort3:先数组的sortOn排序,再用swapChildrenAt设置层,不设置没有变化的层.
doSort4:先数组的sortOn排序,再用setChildIndex设置层,不设置没有变化的层.
doSort5:这里我是采用分冶策略和快速排序的思想是一样的,我原以为这种方法会很快,结果不是这样的,这里不是因为分冶策略的方法慢,是因为每次划分的时候都会带来错误的层设置,所以导致最终的速度变慢,大家可以将doSort4结合4叉树进行深度排序
private function doSort1(maxNum:int):void {
var sortedLayers:Array = arrayResult;
sortedLayers.sortOn("y")
var item:Sprite=null;
var child:Sprite=null;
for (var i:uint=0; i<maxNum; i++) {
setNum++;
setChildIndex(sortedLayers[i], i);// 最耗cpu
}
}
private function doSort2(maxNum:int):void {
var sortedLayers:Array = arrayResult;
sortedLayers.sortOn("y")
var item:Sprite=null;
var child:Sprite=null;
for (var i:uint=0; i<maxNum; i++) {
item = sortedLayers[i];
child = getChildAt(i) as Sprite;
if (child != item) {
setNum++
swapChildren(child, item);
}
}
}
private function doSort3(maxNum:int):void {
var sortedLayers:Array = arrayResult;
sortedLayers.sortOn("y")
var item:Sprite=null;
var child:Sprite=null;
for (var i:uint=0; i<maxNum; i++) {
item = sortedLayers[i];
child = getChildAt(i) as Sprite;
if (child != item) {
setNum++
swapChildrenAt(i, getChildIndex(item));
}
}
}
private function doSort4(maxNum:int):void {
var sortedLayers:Array=arrayResult;
sortedLayers.sortOn("y")
var item:Sprite=null;
var child:Sprite=null;
while (maxNum--) {
item = sortedLayers[maxNum];
child = getChildAt(maxNum) as Sprite;
if (child != item) {
setNum++
setChildIndex(sortedLayers[maxNum], maxNum);
}
}
}
//公冶策略
public function doSort5(array:DisplayObjectContainer):void{
var size:uint=array.numChildren;
sort(0,size-1);
function sort(left:int,right:int):void{
if(left>=right) return;
var mid:int=getPartition(left,right,array.getChildAt(right));
sort(left,mid-1);
sort(mid+1,right);
}
function getPartition(left:int,right:int,mid:DisplayObject):int{
var lp:int=left-1;
var rp:int=right;
while(true){
while(mid.y>array.getChildAt(++lp).y){}
while(rp>0 && array.getChildAt(--rp).y>mid.y){}
if(lp>=rp){
break;
}else{
array.swapChildrenAt(lp,rp)
}
}
array.swapChildrenAt(right,lp)
return lp;
}
}








发表评论 评论 (16 个评论)
用链表排序,cpu消耗<=0(无限接近于0)
用链表排序,cpu消耗<=0(无限接近于0)
1、内存的快速寻址。
2、遍历对象时的无用遍历次数只有1次。
链表不仅在客户端的深度排序上有着无以伦比的速度优势,而且在服务端的消息队列、地图引擎上也是最小化了遍历速度。
对一这方面,我可以很负责任的说,它是最有效的,没有第二种方式比它更高效。
在我的测试案例里,在地图上以链表关系放上2000个元素,然后修改任何一个元素的Y值,然后设置其合理的层级关系,用链表的处理方式在CPU的消耗上无限接近于0
这是经验,一般人我不告诉他:)
是不是多出来的~。~?
1、内存的快速寻址。
2、遍历对象时的无用遍历次数只有1次。
链表不仅在客户端的深度排序上有着无以伦比的速度优势,而且在服务端的消息队列
a.back=b;
b.back=c;
c.back=d;
这就是链表了哇