Flash RIA

登录站点

用户名

密码

RPG游戏中深度排序性能比较.

33已有 1874 次阅读  2009-11-13 17:38
以下是我在做MMORPG初期的时候,进行的一些算法性能测试,今天在整理东西的时候看到了,所以把他给分享给大家,RPG游戏中经常用的深度排序方法,我将大家常用的方法做了很小的修改进行性能测试,
结果如下:
性能从高到低: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 个评论)

  • sos263665629 2011-01-27 22:49
    我是采用搜索附近物体的深度,来计算移动物体的深度。比如算法发现右边有个物体的深度为5, 那么我就让移动物体的深度为4
  • 骷髅小白 2011-01-29 18:46
    sos263665629: 我是采用搜索附近物体的深度,来计算移动物体的深度。比如算法发现右边有个物体的深度为5, 那么我就让移动物体的深度为4
    好想法!佩服!
  • 灵龙 2011-02-09 13:15
    了解一下~~·
  • Fighting 2011-02-11 14:49
    支持下~~
  • joe51586 2011-02-11 20:05
    深度排序用数组怎么用都是浪费CPU
    用链表排序,cpu消耗<=0(无限接近于0)
  • 青竹 2011-02-12 11:26
    joe51586: 深度排序用数组怎么用都是浪费CPU
    用链表排序,cpu消耗<=0(无限接近于0)
    链表有额外的性能开效,比如创建Node. 在高频率调用的时候,可能不合适。这只是我的想法,我没有做过测试,如果你测试过,记得和大家分享,谢谢.
  • joe51586 2011-02-23 13:28
    链表的根本优势有两点:
    1、内存的快速寻址。
    2、遍历对象时的无用遍历次数只有1次。
    链表不仅在客户端的深度排序上有着无以伦比的速度优势,而且在服务端的消息队列、地图引擎上也是最小化了遍历速度。

    对一这方面,我可以很负责任的说,它是最有效的,没有第二种方式比它更高效。
    在我的测试案例里,在地图上以链表关系放上2000个元素,然后修改任何一个元素的Y值,然后设置其合理的层级关系,用链表的处理方式在CPU的消耗上无限接近于0

    这是经验,一般人我不告诉他:)
  • ttyangsijia 2011-02-25 11:25
  • 天策魂之音 2011-03-01 11:50
    setNum++
    是不是多出来的~。~?
  • oyypm 2011-03-17 11:39
    混脸熟
  • oyypm 2011-03-19 09:21
    混脸熟
  • summer00xia 2011-04-01 13:11
    joe51586: 链表的根本优势有两点:
    1、内存的快速寻址。
    2、遍历对象时的无用遍历次数只有1次。
    链表不仅在客户端的深度排序上有着无以伦比的速度优势,而且在服务端的消息队列
    大哥能具体透入点 一些学习的资料么, 比如说学习链表 看什么资料,我不懂,这链表。。
  • joe51586 2011-04-12 21:27
    summer00xia: 大哥能具体透入点 一些学习的资料么, 比如说学习链表 看什么资料,我不懂,这链表。。
    链表没有什么资料呀,是一个简单而又高深的东西.
    a.back=b;
    b.back=c;
    c.back=d;
    这就是链表了哇
  • foodyi 2011-05-27 10:44
    sos263665629: 我是采用搜索附近物体的深度,来计算移动物体的深度。比如算法发现右边有个物体的深度为5, 那么我就让移动物体的深度为4
    这这个做法没有问题吗.., 那么之前深度为4的 物体或者人物的遮挡是不是就会出现问题了。
  • sos263665629 2011-06-01 23:22
    foodyi: 这这个做法没有问题吗.., 那么之前深度为4的 物体或者人物的遮挡是不是就会出现问题了。
    附近搜索方式只搜索角色周围一定范围。如果找不到,说明周围无物体,也就不存在谁挡谁。把角色设置为4,原来的4显示列表会自动往后移,不需要我们管。因为我现在做的游戏地图上的物体太多了(2000-5000)个吧。有些又是玩家在玩的过程中自己建的,没法对地图上的物体进行遍历,效率太低了,只好采用附近搜索了。
  • foodyi 2011-06-07 14:27
    sos263665629: 附近搜索方式只搜索角色周围一定范围。如果找不到,说明周围无物体,也就不存在谁挡谁。把角色设置为4,原来的4显示列表会自动往后移,不需要我们管。因为我现在做的游戏
    这倒是个办法,不过附近的标准怎么去计算呢,一个屏还是什么? 总感觉这个办法不稳妥,现在就没有一个权威一点的排序方案吗? 还是有知道的不说
涂鸦板