优化Flash性能(五)

正如字面含义,局部复制结合了Flash显示列表和把像素复制到BitmapData对象两种方式。特别是,在舞台的每一个显示对象是位图时,把他们加入显示列表,然后像一般的显示对象比如影片剪辑那样操控就行了。把每个对象的动画复制到一个BitmapData对象的数组里。

例如,使用之前有正方形运动选择穿过舞台的文件例子,我把正方形和它们各种旋转,将这些BitmapData对象存放在一个数组里,放在bitmap里加入显示列表,然后在Event.ENTER_FRAME循环里操控这些bitmap就像操控任何显示对象那样(比如之前描述的影片剪辑)。最后,我将bitmap的bitmapData属性分配给对应的数组元素。(看看这是如何实现的,可以复习blit_test/partial_blitting_test.fla文件。)

在我的电脑上,Partial blitting测试(24-26fps)不会像stage blitting一样快。但是这个方法为你启发了思路,因为也许在其他方面partial blitting比stage blitting快。另外,partial blitting比stage blitting好编码。所以呢,如果你用partial blitting技术可以得到效果好的帧频,那么它还可以减少在stage blitting里必须要做的额外工作。(就是如果能用局部复制就可以不用stage blitting了。)

有关Event.ENTER_FRAME 循环

在一个实例上,创建多个Event.ENTER_FRAME侦听器,回调多个函数,要比一个实例上创建一个侦听器回调一个函数,这个函数再调用其他函数,要稍微快那么一点点。(好绕口啊~~~~~~)

但是,这有个不同的情况:在多个对象上分别侦听Event.ENTER_FRAME,和一个对象上侦听一个相比较,使用一个对象侦听一个是多个对象拥有各自侦听器性能的大约两倍。(可以看enterframe_test_one_v_many_loops_with_different_movieclips 文件夹下的例子。)

理解For循环,while循环和do循环

在Flash里,for的倒序循环是最快执行的循环。如果在循环里需要存储的都是相同类型的对象,一个保存所有对象引用的,使用Vector的倒序for循环是最快的。

如果你使用int而不是uint来迭代元素,那这三个循环都执行的都挺快。如果你递减循环变量而不是增加,那么三个循环也会一样快。(注意:如果你递减的循环变量i使用的中止条件是i>=0,并且i是uint的话,你可能会触发一个没有结束的循环。)

如果你使用的是变量或常量作为循环结束的标志而不是表达式或对象属性,那么三个循环一样快。因为初始条件仅需要评估一次(而不是每次循环迭代都要判断),在任何循环里循环里,使用判断式或对象属性作为初始条件都没有大的差别。

任何不会影响循环的内容都应该放到循环的外面。这包括在循环外定义对象(看重用对象的单元),有时在循环里使用新的构造函数可以放在循环外面,如果结束条件是个表达式,应该在循环外算出来。

我曾看过这种说法,对每一个有个下个对象引用的对象循环(类似链表),要比一个数组存储所有对象引用的循环快。在我的测试结果显示,这是不对的。

使用数组比先初始化再使用要快和容易。使用Vector而不是数组,当然要更快了。(见for_loop_v_sequential_loop 文件夹下的例子。)

所有的这些建议可能在很多情况下没什么很大差别。但是,如果你的代码要利用一切可以利用的资源,或者你的工程里有数量惊人的迭代,这些细节值得你参考。

禁用鼠标交互

影片剪辑和sprite可以和鼠标交互。即使你没有为鼠标交互编任何代码,当这些对象存在时Flash Player会检查鼠标交互。所以你可以禁用一些不需要的交互拯救一点CPU资源。

当你注意到性能问题,鼠标滑过舞台时(或者你的电脑风扇加快转速),这个策略非常有用。禁用鼠标交互可以提升性能还可以让你的电脑风扇安静点。

在测试时,我看到当禁用所有影片剪辑的鼠标事件后,帧频增加了2 1/2倍,这个测试代码在mouse_interactivity 文件夹下。

移除事件侦听器

即使最新版本的Flash Player出现了两个功能:当对象被垃圾回收后移除侦听器,和强引用侦听器不再延迟垃圾回收。你仍然要尽可能明确地移除所有的事件侦听器。侦听器越是迅速的移除掉,被占用的CPU资源越少。另外,你可能不知道你装了哪个版本的Flash Player,老版本是没有垃圾回收对象的——即那些对象是弱引用侦听器。不要依赖最新的Flash Player功能,而要踏实优化自己的糟糕代码。



发表评论

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

*

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

(Spamcheck Enabled)