最近我在整理以前的AS1,AS2代码的时候,发现了很多好玩的小DEMO。不过在我改成AS3之后,性能并不是让我很满意,AS3很完整,很程序化,不 过在一些性能方面,如果你没有及时释放掉内存,可能会跑的比AS2来编写的还慢,很奇怪吧。不过在Flash Player 10推出之后,有一个对性能极大有帮助的命令很重要,就是:Vector,感兴趣的,可以打开帮助文档好好看看,不过我今天并不是要讲这个。
我也是刚看到Armand Niculescu 的AS3 Performance Optimization的这篇文章,才随机写写。在我之前有篇文章写过对于全选数组的方法,怎么样才是最好。同时我顺便把他的文章,重要的一些方式提出来,放在自己的BLOG,同时也是给自己做个资料备份。
我个人认为,一款程序的性能高与低,完全是在于程序员的写代码的方法,虽然我提倡的很自由的代码写作方法,不过,在需要耗费大量CPU性能的地方,还是需要按照严格的:命令的规范,变量定义的规范等等。特别是你如果已经知道某个变量大概的范围,比如是int类型的,就不要偷懒搞成Number类型。
比如把偷懒的一长句改成勤劳的几个小短句
var ary:Array = new Array(); for(var i:int = 0; i < datas.length; i++){ ary.push(i); }
写成
var ary:Array = new Array(); var n:uint = datas.length; var i:int; for(i= 0; i < n; i++){ ary = i; }
这样的做法,是对性能是有非常大的帮助的,再比如,我们已经知道一个数组(Array),里面包含的全都是Object.那么需要知道每个Object.id的话,这样写
var currentId:int = array.id;
需要改写成下面的格式就会好点
var obj:Object = array; var currentId:int = obj.id;
你可以注意到,这些所谓的性能优化,就是一个要点,把"简单"的写法写的"复杂"了。不过这是一个好习惯,对你的程序的性能优化也是有非常大的帮助的。当然这些的优化将会在你使用一千次,或者上万次就会体现出来了。
在一些算法上,尽量用自己写的构造函数,比如那篇文章里提到了比较两个数大小的构造函数,一般人偷懒就直接来:
var x:int = Math.min(a,b);
这个很简单,我也很喜欢,如果不是自己去写一些变态的运算法则,我一般都是这么写的。不过,不过,个人建议还是这个好:
var x:int = (a<b) ? a : b;
简直好太多了,对于这种写法在辨别条件语句的时候,是非常好的。
同时也要注意了,数组的一些语句并不好用,比如push(), pop(), shift() or unshift(); 当然这些性能上的优越也是在大量的运算下才会体现出来,如果你是那种力求完美的家伙,就该改用自己写的构造函数。
当然如果你足够变态,像下面的语句改写:
var x:int = a*2; var y:int = b*16; var z:int = c/4;
写成
var x:int = a << 1; //2^1 = 2; var y:int = b << 4; //2^4 = 16; var z:int = c >> 2; //2^2 = 4;
呵呵,这个就过于烦琐了,一不小心还会搞错。起码我是不会用。还有其他的方法都可以去看看里面的文章,不过我一般用以上几个,其他的过于烦琐,就懒的用了,除非真的碰到上万个,极端夸张的运算方式。下面就来说下怎么搞定上万,不,就上千个图标的排列吧。
我们试想一种情况(当然,本人是绝对反对这种方式的),我们在点击某个点,然后“蹦”的跳出来上千个细小的图标。然后在屏幕上晃啊晃的。如果你写成 MovieClip,Sprite,Shape等等,甚至你开启了cacheAsBitmap为true,我保证,你的电脑绝对会卡死你(当然,如果让你老板看到了也是不错的,你看,我的电脑很破旧了,该升级了)。那么我们该如何解决这个呢。
第一,不要那么多的细小的图标,换成50个,50个的来。这是我比较提倡的方式,毕竟操作者谁也不喜欢满屏幕都在晃。
第二,化你的MovieClip也好,Sprite也好,Shape也好,通通搞成Bitmap。明白了吧,而且你如果删除Bitmap的话,还可以用dispose(),命令清空内存。
那么,你肯定会说,我在舞台上addChild一个Sprite,然后再removeChild,是否会清空掉内存呢?很遗憾,不会。不过在我两个多小时无聊的测试中,我发现,只要你在后期removeChild后,虽然内存未清空,在不停的运算中,不停的增长,但是到了一定的阶段,他就STOP 了,WHY?我不知道。不过哪怕就算是这样,内存占用的状况还是不容乐观。所以改写成Bitmap,就是最好的方式。 那怎么做?
先期,你addChild一个Bitmap后,在后面不需要的时候,在removeChild之前,加上Bitmap.bitmapData.dispose();和Bitmap.bitmapData=null; 这个很重要。
差点忘了也是很重要的一个,就是记得要removeAddEventListener。监听事件如果不需要了,就一定要remove掉。特别是EnterFrame事件。
头晕了没?我想你已经晕了,性能优化一般都是源于良好的写作习惯,和追求完美的精神。在FLASH上,你就需要做到:
体积能小就小,
性能能快就快,
界面能简洁就简洁,
组件能不用就不用,
图片能用画就画。
其他的暂时没想到。