ActionScript 的性能优化

以前一直在为着能不能实现一个功能而努力,现在则是为了能不能实现更好的性能的而努力了。。。也许这就是成长了吧。

很久很久以前,就经常逛天地会,看各种高手写的优化性能的文章。 里面提到的东西多是如下:
1. for each 速度大于 for
2. 单一类型采用Vector
3. Bitmapdata 和 矢量 之前的 cpu 与 内存之争
4. 加减运算的速度快于 乘法 与 除法

当时不断的追求这些东西,每当遇到性能瓶颈的时候,总是思考遍历的方式是不是不正确。 半年后的我,回头一看,才发现其实这一切基本都错了。

就拿遍历来说吧, for each 和 for in 以及 for 循环他们之间的性能在 百次 的差距并不明显,只有在万次循环时才有明显差距。 但是在大型游戏中,每帧给你做万次循环那这大型游戏基本就卡死了,而论坛上那些高手们的万次循环都是简单的赋值操作而已,在真实情况也基本不会出现要做万次循环的操作。 所以这些性能测试不过是钻牛角尖而已。

要真正提高性能,只改变循环方式并不能根本解决问题。 实际上,可以把一个循环平摊到多个游戏帧中去执行。 普通游戏一般都是25帧每秒,把一个100长度的遍历平摊下去的话,每帧只要遍历4个长度就够了,把这种遍历放在一般游戏的深度排序上,性能会有很大的提升。

之后来说说BitmapData 和 矢量 之争, 很多人说 BitmapData 占用内存 矢量 消耗CPU, 于是很多人都在做艰难的抉择。 这实际上又是在钻牛角尖了。 还是以大型游戏为例,在游戏中人物的资源必须是 BitmapData. 因为游戏中的游戏对象很多,如果全部采用矢量,那CPU是耗不起的。 而全部采用 BitmapData 又会消耗大量的内存, 于是很多人就卡在这里,一直在思考 XXX个对象用BitmapData , XXX个对象用 矢量 这种解决不了根本问题的方法。

BitmapData 的大小实际上是可以计算出来的。 一个像素 AARRGGBB 占用4个字节。 一张位图的内存大小实际上是 长*宽*4/1024 即可计算出位图的内存大小,因此位图的大小基本和位图的占用的硬盘大小无关,和它的面积有关。 那么要节省内存就有方向。
1. 缩减BitmapData 的面积, 比如Avatar中可将所有部位按不规则的方式挤在一起,虽然还原的操作比较麻烦,但能明显减小面积。
2. 缩减像素 由于BitmapData 内存大小是 长*宽*像素大小,本质就是算总像素个数而已。那么实际上可以通过将无用像素全部剔除,在不改变面积的情况下,缩减像素的数量,从而缩减位图的内存大小。

~~先写这些吧~ 最近经常看到群里很多新手都在问这个循环的效率怎样,那个循环的效率怎样,实际上都只停留在表面,没有深入其中探究本质的表现啊,嘛嘛~这样挺像当初的我的说。。。
PS : 话说域名快到期了。。。差不多要去续费了啊。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.