`

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

阅读更多
http://bbs.9ria.com/viewthread.php?tid=73161&extra=page%3D1%26amp;orderby%3Ddateline%26amp;filter%3D86400

以下是我在做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",Array.NUMERIC)
                        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",Array.NUMERIC)
                        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",Array.NUMERIC)
                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",Array.NUMERIC)
                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;
                }
                        
          }






doSort5,是不是对数组进行快速排序,到最后再来一次setChildIndex要快一点呢。
在getPartition中每次都swapChildrenAt,不太好吧。
另外递归的掉用,应该也会影响点效率的吧


还是不如
			var sortedLayers:Array= _list;  
			var maxNum:int = sortedLayers.length;
			var t:int = getTimer();
			sortedLayers.sortOn("y",Array.NUMERIC);
			var item:Sprite=null;  
			var child:Sprite=null;  
			var numChilds:int = sp.numChildren;
			while (maxNum--) 
			{  
				item = sortedLayers[maxNum];
				sp.addChildAt(item, maxNum);
			}  

这样效率高
分享到:
评论

相关推荐

    RPG游戏设计实现分析毕业论文.doc

    本论文旨在对RPG游戏的设计与实现进行分析,着重于RPG游戏的制作流程、游戏软件RPG Maker XP的使用以及游戏测试的重要性。论文首先对RPG游戏进行概述,介绍RPG游戏的制作意义、游戏类型的前景等。然后,对RPG Maker ...

    RPG游戏-战火与荣耀UI.zip

    RPG游戏-战火与荣耀UI.zipRPG游戏-战火与荣耀UI.zipRPG游戏-战火与荣耀UI.zipRPG游戏-战火与荣耀UI.zipRPG游戏-战火与荣耀UI.zipRPG游戏-战火与荣耀UI.zipRPG游戏-战火与荣耀UI.zipRPG游戏-战火与荣耀UI.zipRPG游戏-...

    用DirectX编写RPG游戏PDF-Programming.Role.Playing.Games.with.DirectX+源

    DirectX是微软开发的一套用于Windows操作系统的应用程序接口(API),它主要被游戏开发者用来创建高性能的图形和音频应用,特别是在电子游戏开发中扮演着重要角色。本篇将深入探讨如何利用DirectX来编写角色扮演游戏...

    Unity游戏项目源码 unity3D RPG游戏开发包 完整版.zip

    在这个"Unity游戏项目源码 unity3D RPG游戏开发包 完整版.zip"压缩包中,你将获得一个完整的角色扮演游戏(RPG)项目的源代码,这为你提供了深入理解Unity3D游戏开发的宝贵资源。 首先,源码是学习编程和游戏开发的...

    RPG游戏设计与实现毕业设计.doc

    RPG游戏设计与实现毕业设计.doc

    Unity 3D的Ultimate MMO RPG Kit 在线 mmo rpg 游戏开发.zip

    Unity 3D是一款强大的跨平台游戏开发引擎,广泛应用于创建各种类型的游戏,包括单机、多人在线(MMO)和角色扮演游戏(RPG)。"Ultimate MMO RPG Kit" 是一个专为开发在线MMO RPG游戏设计的工具包,它包含了各种预设...

    基于C++开发UE4魔兽RPG风格的RTS游戏模板源码.zip

    基于C++开发UE4魔兽RPG风格的RTS游戏模板源码.zip基于C++开发UE4魔兽RPG风格的RTS游戏模板源码.zip基于C++开发UE4魔兽RPG风格的RTS游戏模板源码.zip基于C++开发UE4魔兽RPG风格的RTS游戏模板源码.zip基于C++开发UE4...

    c#游戏开发基于unity3d的回合制RPG游戏源码.zip

    c#游戏开发基于unity3d的回合制RPG游戏源码.zipc#游戏开发基于unity3d的回合制RPG游戏源码.zipc#游戏开发基于unity3d的回合制RPG游戏源码.zipc#游戏开发基于unity3d的回合制RPG游戏源码.zipc#游戏开发基于unity3d的...

    第二版用DirectX编写RPG游戏PDF-Programming.Role.Playing.Games.with.DirectX.

    7. **资源管理**:在大型RPG游戏中,有效地管理大量的图形、音频和数据资源对性能至关重要。这涉及内存管理、资源加载和卸载策略,以及优化技术。 8. **场景管理**:游戏世界的组织和导航通常需要一个场景图或层次...

    RPG_Game.rar_RPG 游戏代码_android_com.game.rpg_甜蜜镇rpg代码_甜蜜镇的代码

    这个项目的代码可以直接在Android Studio中导入并进行二次开发,为有志于学习或改进RPG游戏的开发者提供了宝贵的资源。 一、项目结构与导入 "RPG_Game"项目包含了一系列的源码文件,这些文件按照Android Studio的...

    经典RPG爱情游戏附Delphi源代码..rar

    经典RPG爱情游戏附Delphi源代码..rar

    J2ME(RPG)游戏源码-梦幻西游.rar

    《梦幻西游》是一款基于Java ME(J2ME)平台开发的角色扮演游戏(RPG),其源码的公开为开发者提供了一次深入理解移动设备上2D游戏开发的宝贵机会。以下将详细介绍J2ME和RPG游戏开发的相关知识点: 1. **Java ME ...

    unity 3D多人在线RPG网络游戏源码.rar

    unity 3D多人在线RPG网络游戏源码.rarunity 3D多人在线RPG网络游戏源码.rarunity 3D多人在线RPG网络游戏源码.rarunity 3D多人在线RPG网络游戏源码.rarunity 3D多人在线RPG网络游戏源码.rarunity 3D多人在线RPG网络...

    Unity 3D的RPG游戏《魔盒兄弟》源码.zip

    在《魔盒兄弟》这样的RPG游戏中,物理系统可能用于环境交互或战斗中的碰撞检测。 10. **脚本编程**:Unity主要使用C#进行脚本编写,源码中会有大量C#脚本,包括面向对象的设计模式、组件通信、委托和事件等高级特性...

    RPG游戏系统软件需求说明书.doc

    《RPG游戏系统软件需求说明书》是一份详细阐述RPG(角色扮演游戏)系统软件开发需求的重要文档,旨在为计算机科学与技术领域的专业人士提供清晰、全面的项目指导。这份报告由计08-1班的LXZ-学号的学生编写,并在2020...

    RPG编程同C语言编程的比较.docx

    RPG编程同C语言编程的比较 RPG编程语言是IBM System i平台上的高级语言,具有强大的编程能力和高效的执行速度。与C语言相比,RPG语言有其独特的语法和特点,本文将对RPG语言和C语言进行比较,讨论它们的异同。 ...

    D游戏算法——RPG游戏初步.ppt

    D游戏算法——RPG游戏初步.ppt

    基于unity3d的回合制RPG游戏源码+项目说明.zip

    基于unity3d的回合制RPG游戏源码+项目说明.zip # RoundRpg 一款基于Unity3d,使用Tolua的回合制完整RPG Demo | 游戏 | 截图 | 截图 | 截图 | 截图 |截图 | | - | - | --- | --- | - |- | |![](nor.png)|![](enc.png)...

    rpg游戏乱码怎么解决.docx

    在玩RPG游戏时,有时会遇到乱码问题,这可能是由于游戏的编码与系统环境不兼容导致的。本文将详细介绍如何解决RPG游戏乱码的问题,让你顺利体验游戏的乐趣。 首先,我们要明白乱码产生的原因。大多数RPG游戏,尤其...

    用DirectX编写RPG游戏

    10. **性能优化**:RPG游戏往往对性能要求较高,开发者需要关注GPU和CPU的使用情况,进行优化,如多线程、批处理渲染、LOD(细节层次)和视锥体剔除等。 以上只是DirectX编写RPG游戏的部分核心知识点,实际开发过程...

Global site tag (gtag.js) - Google Analytics