Flash代码执行原理与性能优化笔记

一. 执行基本原理

  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()方法,清除先前所画的部分。

posted @ 2010-12-21 00:45  C_ray  阅读(1001)  评论(0编辑  收藏  举报