一. 执行基本原理
Flash平台运行时在一个循环中执行,它以划分的“帧”为单位进行处理。于是帧速率即对应着分配给每个帧的时间,如指定帧速率为20帧/秒,则运行时会尝试对每个帧执行1/20秒。即使在时间轴上不存在可以多个帧,单一帧所表现的SWF内容也会被周期性地进行处理。 帧的执行又可划分为2个阶段:
(1)ActionScript 代码的执行(经由 ActionScript Virtual Machine)
(2)显示对象(DisplayObject)的呈现
如果需要执行的代码是要进行比较耗费CPU的密集型计算,那么以上Idle的空闲时间就会被占用掉。帧之间需要用作画图呈现的时间就会被延长,相应的回放帧的速率就会变慢:
因为ActionScript中没有提供多线程的机制进行处理,此时代码运行以及界面绘图的任务需要在单一线程中完成。实际上Actionscript 把耗费CPU的计算分成了各个更小而且独立的段,使之在跨越多个帧的时候也能独立执行。在划分的各个段之间就可以重绘呈现出界面,使后续帧的播放不受打断:
二. 性能优化措施
(1) ActionScript3的资源管理
Grant Skinner 在其Blog的AS3资源管理系列文章中已经较为详细的介绍了FlashPlayer的GC工作原理,以及资源管理时可能出现的问题等。强烈推荐感兴趣的园友可以仔细研究下。
(2)性能改进的办法
1. 利用FlashBuilder的Profile工具发现瓶颈的区域。
2. 重用对象
在涉及到不断重复使用对象时,考虑利用对象池处理。在初始化阶段先创建一定数量的对象并将其存储到一个容器(Array / Vector)对象中。在对象完成操作后,可清除对象的相互引用防止其仍然执行占用CPU(注意不要将对象的引用置为null)。然后把对象放入池中,再次用到时直接从池中检索即可。
3. 注册事件监听器时利用弱引用
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false)
4. 移除已经注册的对应的事件监听器。
5. 自定义的显示对象在重绘之前对引用到的Graphics调用clear()方法,清除先前所画的部分。