优化Flash性能(四)

管理CPU/GPU使用情况

当前,我唯一知道如何直接查看的工具就是使用操作系统自带的。Windows里有一个任务管理(性能选项卡)和Mac OS提供的活动监视器。这两个工具都可以让你看CPU的使用情况,但是一般来说,它们对测试Flash性能不是特别有用。

结果,你直接查看CPU/GPU的使用只能通过检查你应用的帧频了。MT类可以让你检查项目的帧频,还有内存使用报告和内存跟踪。

处理cacheAsBitmap 和cacheAsBitmapMatrix

使用DisplayObject的cacheAsBitmap属性可以大幅度提高性能(和内存),只要DisplayObject不经受需要频繁更新位图的改动。换句话说,DisplayObject在某种程度上不改变外观只是改变它在舞台上的位置。如果频繁更新位图,性能会降低。

你可以经常改变位图缓存,仍然可以看到性能上的收益,这取决于几个因素,但不要太惊讶,最重要的因素是,你是如何经常改变位图的。

无论如何,用MT类测试一个指定的工程,然后看看用位图缓存和不用有什么差别。(当决定是否对那些不需要位图改变的显示对象使用位图缓存时要不加思考的就使用!)

如果你有一个显示对象(如影片剪辑),你想使用位图缓存属性,加上这句:

mc.cacheAsBitmap = true;

即使你改变显示对象的大小、倾斜、透明度和或者旋转(但不改变影片剪辑的帧数),然后发布到移动设备,使用位图缓存也是能提升性能的。

尤其是,当把一个工程发布到移动设备时,你可以启用cacheAsBitmap并分配catheAsBitmapMatrix属性,完成后可大幅提升性能,像这样:

mc.cacheAsBitmap = true;
mc.cacheAsBitmapMatrix = new Matrix();

不要使用默认单位矩阵。以后你就会知道有几个原因促使你使用这个属性而不是用默认矩阵。

Stage blitting(我不知道把它翻译为“阶段块传输”还是“舞台块传输”)

这是一个描述数据传输的术语,包括了将使用的位图最终渲染到显示屏幕上。不是将显示对象加到显示列表里,而是把像素“放在”舞台大小的位图里,然后把位图“加到”舞台上。为了更新动画,位图的像素要在一个循环里更新。尤其是在Event.ENTER_FRAME循环里,使用BitmapData类里的copyPixel()方法,将舞台大小的位图里的BitmapData属性,在动画的循环之外替换其他的bitmapData对象。

这个方法比直接把对象放到显示列表里复杂,但它更有效率——如果你有个没法容忍的帧频和需要高帧频的Flash应用,这个方法会非常有用。诚然,除非你想增加帧频,否则你绝对没有理由使用这个方法。

我比较了一个SWF文件,它有10,000个正方形影片剪辑,执行运动和旋转动作,还要穿过经过舞台(可以看 blit_test/blit_test_mc.fla范例)。然后我把这个文件做了一些基本的优化(可以看blit_test/blit_test_basic_optimizations.fla文件)和stage blitting(看blit_test/blit_test2文件)。

第一个SWF文件大概为15fps,这是不能容忍的。但是,在应用最难的技术优化比如块传输之前,几个基本的调整就可以轻松提高性能。

首先,我将循环倒序,这样有了一点的性能提升(看下面循环的单元),然后,更重要的是,我使用一些常量取代了一些相同的但要重复计算的变量。这些调整时性能有了稍微大点的提升(约40%),让帧频可以稍微让人接受点了,约21fps。

使用stage blitting编码同样的显示区域,结果帧频变成了54fps,整整提升了350%。

但是,正如我之前说的,这个技术的过程很复杂,包括下面几个方面:

1.初始化需要在每个Event.ENTER_FRAME事件里循环的,要在舞台上显示的位图资源(Bitmap实例,BitmapData实例和Rectangle实例)。

2.创建一个所有要显示更新数据的数组。(这步不是必须的。)

3.创建一个BitmapData对象的数组。如果你的动画在一个影片剪辑的时间轴上,这是你要每帧都存储BitmapData对象的地方(例如,使用一个sprite列表,在范例文件夹里我为每个角度的矩形都创建了BitmapData实例,这个实例可以用AS旋转。)

4.创建Event.ENTER_FRAME事件循环。

5.更新循环里的元素,将第3步里创建数组里相应的像素,复制到在第1步里创建BitmapData实例对应的地方(第2步决定使用data数组)。

想看更多细节,请看blit_test/blit_test2,它还包括额外的注释。

Stage blitting技术的负面,不是复杂的编码,而是也许在创建需要的位图是消耗大量的内存。当为类似iPad之类有很高分辨率(第一、二代1024*768,第三代2048*1536),相对低的内存(RAM)和容量(一、二、三代分别为256MB,512MB和1GB)的设备写应用时,这是个要严肃考虑的问题。

一般来说,你的游戏应消耗不多于一半的可用RAM。这指的是,不仅包括位图而是你游戏里的一切消耗。



发表评论

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

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

(Spamcheck Enabled)