Flash AS3 性能优化
Adobe 官方性能优化文档,很全面,非常好!
http://help.adobe.com/zh_CN/as3/mobile/index.html
http://www.rozengain.com/blog/2007/05/01/some-actionscript-30-optimizations/
【Flash性能优化的一些细节概要:,是否在没有必要的时候做了无用功,往往从这些方面就能找到那些导致性能低下的地方。 2、优化细节代码 针对细节总是好的,有一些小技巧比如: 用 var obj:Object = {}; 要比 var obj:Object = new Object();要好; var arr:Array = []; 要比 var arr:Array = new Array...】
尽量避免使用try catch
1、改进算法
无论对于那一种程序,好的算法总是非常重要的,而且能够极大地提高程序性能,所以任何性能的优化第一步就是从算法或者说程序逻辑的优化开始,检查自己的程序是否有多余的运算,是否在没有必要的时候做了无用功,往往从这些方面就能找到那些导致性能低下的地方。
2、优化细节代码
针对细节总是好的,有一些小技巧比如:
用 var obj:Object = {}; 要比 var obj:Object = new Object();要好;
var arr:Array = []; 要比 var arr:Array = new Array(); 要好;
for (var i:int=0, len=arr.length; i<len; i++) 要比 for (var i:int=0; i<arr.length; i++) 要好;
如果不是为了保存颜色值请不要适用uint这个类型,他的速度比起 int要慢多了;
Array的遍历要比Object或者Dictionary的枚举要快得多。
if (myObj != null) 要比 if (myObj) 的速度要快, for (var i:* in myObj) 比 for (var i:String in myObj) 要快;
Dictionary当 weak key设置为 true 的时候要比 false 慢;
var myText:String = “a” + “b” + “c”;
var myText2:String = [ "a", "b", "c" ].join(”");
在JavaScript里面在IE下后者要更快,但是在AS里面,前者更快!
在循环体内声明变量和在循环体外声明变量其实速度上不会有太大的区别。
3、权衡程序的结构
程序的架构也非常重要,良好的结构会带来性能和程序健壮性的提升,但是有的时候又是相互矛盾的,例如代码写得过于健壮,反而会影响性能,这个地方需要开发者自己去权衡。
4、小心Flash的重绘
如果你使用的是Flash Player 的Debugger版本,那么请在检查性能瓶颈的时候不要忘记打开显示重绘区域的功能,这将帮你迅速定位到舞台上有那些地方被重绘了,找出没有显示任何东西却不断重绘的地方,这些地方肯定是有问题的。Flash Player很笨,不会说你把一个DisplayObject的visible设置成false就放弃重绘那个显示对象。所以请保证你的 MovieClip在visible=false的时候为停止状态。有一点很有意思,假设两个现实物体存在 hitTest = true 这样的关系,那么重绘的区域的面积很有可能 > 两者的面积总和!
5、以空间换时间
听起来挺虚,实则很简单,说白了就是以内存换CPU,例如将不变动的值进行保存,免去下次需要此数据的时候进行再次计算,虽然原理很简单,但是有的时候却很容易疏忽掉,而这个往往就造成你的算法效率低下的问题。
6、记得销毁你的对象
对于非常驻的对象使用完之后记得消除其引用,防止出现内存溢出的问题,往往要做到这一点需要有一个良好的编程习惯。
7、清除冗余的代码
有些代码可能你的程序一辈子也不会执行到,请把这些没有用的代码或者对象清理掉,否则内存会被偷偷的蚕食掉。
8、小心使用useBitmapCache = true
http://blog.zol.com.cn/1595/article_1594547.html
前几日跟小雷配合做了一个项目,访问量统计的,要处理海量数据(其实万级别而已)。做出来之后,从程序启动到画出来图形,要超过15秒的脚本执行限制。这样肯定是不行的,于是我开始研究程序优化——当然我之前也会有所涉及,只不过没有系统的总结过,这次需求比较严峻,所以整理一下。flash性能最低的地方依然在于图形渲染,所以各种循环之中如果可以不包含图形变化就不要包含。我把图形变换放到数据运算之后,渲染速度从9秒多降低到0.4秒不到。循环的速度,有人测出来是for each最快,for其次,while最慢。这个姑且相信吧,因为和我测出来的差不多。数字类型的效率,int最高,number其次,uint最低。这个和as3刚出现时大家说的,能uint就uint完全不一致,uint甚至无法超过number。所以,循环的时候应该是:
(1)如果要存储的东西是对象,可以放在一个数组里面进行处理,需要循环的时候,可以用数组方法比如说every;同时,如果存储的对象包含自己的方法,则可以用for each (var _obj:* in _arr){_obj.method();}这样的方法。
(2)如果存储的是普通数据,可以尽量用for(var i:int=0,len:int=_arr.length;i+=1的效率大于++,也很难理解。公共属性,能不用getter/setter方法就不用,直接公开给外部调用修改。当然这种做法很不符合面向对象思想,不过有些时候也可以这么用。xml的效率并不高,数据存储简单格式还是object吧。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341