ActionScript3.0代码优化集.docx_第1页
ActionScript3.0代码优化集.docx_第2页
ActionScript3.0代码优化集.docx_第3页
ActionScript3.0代码优化集.docx_第4页
ActionScript3.0代码优化集.docx_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ActionScript3.0代码优化技巧第一章 AS3的一些优化计算方法1.用乘法来代替除法(当除数可转化为有限数的时候)比如var n:Number = value * 0.5;要比var n:Number = value / 2;快。但差别并不是很大。只有在需要大量计算情况下,比如3D引擎中差别才比较明显。2.用位运算代替除2或乘2比如101要比10*2快,而101来代替13/2,尽管前者比后者运算速度更快,但2者的运算结果却不一样。所以还是要看具体情况。3.用unit()或int()代替取整运算Math.floor()和Math.ceil()比如var test:uint = uint(1.5);要比var test:Number = Math.floor(1.5);快;而var test:uint = uint(1.5)+1;要比var test:Number = Math.ceil(1.5);也快。如果是Math.floor(),还可以用位运算(0)来代替。比如var test:uint =1.50,比unit()或int()更快。4.用乘-1来代替Math.abs()方法比如var nn:Number = -23;var test:Number= nn 0 ? nn * -1 : nn;要比var nn:Number = -23;var test:Number = Math.abs(nn);快。当然还有更多的优化计算的方法。一般来说,低级运算要比高级运算速度;内部方法比调用其他方法速度快。另外要注意的是,这些方法有的时候可能并一定适用。第二章 Actionscript 优化指南何时进行优化对现有程序进行优化的过程,有时十分的冗长与困难,这与原始代码的非优化程度有关,所以在投入大量时间进行代码优化之前,最重要的是要估计出要在什么地方对代码做出修改或替换。一个游戏代码的最重要的部分就是主循环体,通常情况下该循环体要在flash的每一帧上执行,并控制游戏中的角色属性和重要的数据参数。而对于主循环体以外的部分,也可能是次要循环部分,同样要注意是给其否分配了过多的资源,而没有分配给那些更需要资源的核心部分。 通过积累在各处节约出来的时间(可能每处仅仅是几个毫秒),您会明显发现自己的swf运行得更加稳定,并且游戏感也大大加强。简洁与高效的代码书写出十分简洁、可以再次调用的代码(有时可能是面向对象的)是一项精细的工作,但这需要多年的编程经验。对于OOP(object oriented programming,面向对象的程序设计),有些场合根本利用不到它的优势,这使得它显得十分奢侈。在有限的资源条件下(可能是flash播放器的原因),通过更先进的方法,像刚刚提到的OOP,就可能反而导致令人不满意的结果。我们并不是说OOP对游戏编程不好,只是在某些场合它显得过于奢侈和多余。毕竟有时候“传统的方法”却能得到更好的结果。大体而言,用OOP是比较好的,因为它让代码维护更加简单。但在后文中,你会看到有时为了充分发挥flashplayer性能,而不采用OOP技术。例如:处理快速滚动或者计算十分复杂的数学问题。基本的优化一提及代码优化,我们马上会联想到执行速度的改进,而很少去考虑系统资源的分配。这是因为当今,即使是将被淘汰的计算机,都有足够的内存来运行我们大部分的flash游戏(128M的内存足以满足大多数情况的需要,况且,512M的内存是当今新电脑的基本配置)变量在各种重要的代码优化手段中,有这么一条:在定义局部变量的时候,一定要用关键字var来定义,因为在Flash播放器中,局部变量的运行速度更快,而且在他们的作用域外是不耗占系统资源的。aw附:var变量仅仅在花括号对中才有“生命”,个人认为没有系统学过编程的人容易出错的一个地方:awMC.onLoad = function()var aw = 1;awMC.onEnterFrame = function()/不存在aw这个变量一段非优化代码:function doSomething()mx = 100my = 100ar = new Array()for (y=0; y my; y+)for (x=0; x mx; x+)i = (y * mx) + xarri = i return arr这段代码中,并未声明函数体内的那些变量(那些仅仅在函数内使用的变量)为局部变量,这使得这些变量被播放器调用的速度更慢,并且在函数执行完毕的时候仍然耗占系统资源。下面列出的是经过改进的同样功能的代码:function doSomething()var mx = 100var my = 100var ar = new Array()for (var y=0; y my; y+)for (var x=0; x 50)/ 进行某些操作它的执行速度明显高于下面这段代码:for (var i=0; i 50)/ 进行某些操作前者的效率比后者提高了30%,这个数字在你的游戏要逐帧执行这一段代码的时候显得更加宝贵!高级优化:1) for循环 和 while循环用while循环将会得到比for循环更好的效率。然而,从数组中读取数据,用for in循环式最好的选择!所以我们不推荐使用:for (var i=0; i 1000; i+)/进行某些操作而推荐使用var i=-1while (+i 1000)/进行某些操作2) 从数组中读取数据我们通过测试发现,for in循环的效率大大高于其他的循环方式。参看:arr = MAX = 5000/数组赋值for (i=0; i MAX; i+)arri = ivar item = null/ For 循环for (var i=0; i MAX; i+)item = arri/ For 循环for (var i in arr)item = arri/ While 循环i = -1while(+i MAX)item = arri3) 向数组中写入数据(while , for)可以看到while循环稍占优势。4) _global(全局)变量同Timeline(时间轴)变量我们猜测采用全局变量能提高变量调用速度,然而效果并不像预计的那样明显。5) 单行、多行变量赋值我们发现单行变量赋值效率大大高于多行。比如:a = 0b = 0c = 0d = 100e = 100效率就不如:a = b = c = 0d = e = 1006) 变量名寻址这个测试反映了变量名的预寻址是非常重要的,尤其是在循环的时候,一定要先给定一个指向。这样大大节约了寻址时间。比如:var num = nullt = getTimer()for (var i=0; i MAX; i+)num = Math.floor(MAX) - Math.ceil(MAX)t1.text = Always lookup: + (getTimer() - t)就不如:t = getTimer()var floor = Math.floorvar ceil = Math.ceilfor (var i=0; i MAX; i+)num = floor(MAX) - ceil(MAX)7) 短变量名和长变量名变量名越短,效率越高。考虑到长变量名也有它的好处(比如,便于维护等),因此建议在关键部位(比如大量循环出现的时候)使用短变量名,最好就1-2个字符。8) 循环前、后声明变量在测试前,我们认为循环前声明变量会更加节约时间,不料测试结果并不明显,甚至还恰恰相反!/ 内部声明t = getTimer()for (var i=0; i MAX; i+)var test1 = it1.text = Inside: + (getTimer() - t)/ 外部声明t = getTimer()var test2for (var i=0; i -1)if (a = 1 & b = 2 & c = 3 & d = 4)var k = d * c * b * a/下面的判断更加节省时间var i=MAXwhile(-i -1)if (a = 1)if (b = 2)if (c = 3)if (d = 4)var k = d * c * b * a10) 寻找局部变量(this方法同with方法比较)局部变量的定位方法很多。我们发现用with比用this更加有优势!obj = obj.a = 1obj.b = 2obj.c = 3obj.d = 4obj.e = 5obj.f = 6obj.g = 7obj.h = 8obj.test1 = useThisobj.test2 = useWithMAX = 10000function useThis()var i = MAXwhile(-i -1)this.a = 1this.b = 2this.c = 3this.d = 4this.e = 5this.f = 6this.g = 7this.h = 8function useWith()var i = MAXwhile(-i -1)with(this)a = 1b = 2c = 3d = 4e = 5f = 6g = 7h = 811) 循环监听键盘事件同刚才所提到的寻址一样,我们实现给一个指向会得到更好的效率,比如:keyDown = Key.isDownkeyLeft = Key.LEFT/我们再用 if (keyDown(keyLeft)附:我们测试了按键代码和键值常量的效率发现并无太大差别。12) Math.floor()方法与int()这个问题曾在Flashkit的论坛被提出讨论过。测试表明,旧的int方法反而效率更高。我们的测试结果也反映了这一点。13)eval表达式与中括号语法我们并没有发现明显的差别,并不像刚才所述那样,旧的eval表达式比起中括号方法并没有太大的优势var mc = eval_r(_root.myMc + i)var mc = _rootmyMc + i/两者效率差不多16) 涉及MC的循环:ASBroadcaster 同欢同循环的差别结论我们从这些测试结果中发现,对于不同的需求,采用不同的代码,我们可以大大提高脚本执行效率。虽然我们在这里罗列了许多的优化代码的方法,需要大家自己测试、实验的还有很多(考虑到每个人的需求不同).如果你想更加深入地讨论这类问题。第三章 浅释ActionScript的代码优化本文既为浅谈代码优化,那么就不深入到OOP设计层面。仅涉及Flash8帮助里面提到的一些代码编写优化原则,并加以解释。准则来源于Flash8 帮助,我做了一些解释:1.避免从一个循环中多次调用一个函数 在循环中包含小函数的内容,可使效果更佳。小函数生命期短,利于资源释放。尤其是在大的循环中时。2.尽可能使用本机函数 本机函数要比用户定义的函数运行速度更快。本机函数即Flash中内有的一些函数(intrinsic),比如hitTest(),你没必要自己写一个类似的。3.不要过多使用 Object 类型。 数据类型注释应力求精确,这样可以提高性能。只有在没有适当的备选数据类型时,才使用 Object 类型。同时也便于代码管理,时刻知道对象的类型和作用。同时也有利于编译器编译时优化。4.避免使用 eval_r() 函数或数据访问运算符。 通常,较为可取且更有效的做法是只设置一次局部引用。不得已时才用eval,比如转换_droptarget为MovieClip时。5.在开始循环前将 Array.length 赋予变量,尤其是大的循环。 在开始循环前将 Array.length 赋予变量(比如var iLength:Number),将其作为条件使用,而不是使用 myArr.length 本身。原因,在循环中,iLength是Number变量,会被放入寄存器使用,效率远比访问Array再得到length高。例如,应使用var fontArr:Array = TextField.getFontList();var arrayLen:Number = fontArr.length;for (var i:Number = 0; i arrayLen; i+) trace(fontArri);来代替:var fontArr:Array = TextField.getFontList();for (var i:Number = 0; i fontArr.length; i+) trace(fontArri);6.注重优化循环及所有重复动作。Flash Player 花费许多时间来处理循环(如使用 setInterval() 函数的循环)。7.在局部变量够用时,不要使用全局变量。类静态变量也要少用。全局变量是开发者的恶梦。实在需要全局变量的话,我建议使用singleton设计模式来进行管理。8.声明变量时,添加 var 关键字。这是为了编译时让编译器知道你的变量类型,优化编译。黑羽补充一点:对关键字的使用要谨慎。不赞成使用关键字作为自己的method和属性名,除非你确认后续开发不会用到相同的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论