废话少说,直接进入细节讨论:
一、使用 REMOVED_FROM_STAGE 和 ADDED_TO_STAGE 事件正确冻结和解冻对象。冻结和解冻对所有对象都很重要,但对显示对象尤其重要。即使显示对象不再位于显示列表中并正在等待作为垃圾回收,他的监听(TimerEvent or Enterframe)仍然占着大量的cpu。所以在显示对象在显示列表中移除时,即使设置为null,也会占内存和cpu ,一定要冻结对象。
冻结的概念在使用 Loader 类加载远程内容时也很重要。通过loader.unloadAndStop(),可以卸载 SWF 文件、自动冻结加载的 SWF 文件 中的每个对象并强制运行垃圾回收器。调用 unloadAndStop() 方法时将执行下列操作:
停止声音。
将删除注册到 SWF 文件的主时间轴中的侦听器。
停止 Timer 对象。
释放硬件外围设备(如摄像头和麦克风)。
停止每个影片剪辑。
停止调度 Event.ENTER_FRAME、 Event.FRAME_CONSTRUCTED、 Event.EXIT_FRAME、 Event.ACTIVATE 和 Event.DEACTIVATE。
二、使用 Event.ACTIVATE 和 Event.DEACTIVATE 事件检测后台是否处于非活动状态,并相应地优化应用程序。 可以帮助您细调应用程序以使其尽量使用最少的 CPU 周期。
例如,动画可能在用户切换到另一个制表符或将应用程序放入后台时失去焦点:
var originalFrameRate:uint = stage.frameRate;
var standbyFrameRate:uint = 0;
stage.addEventListener ( Event.ACTIVATE, onActivate );
stage.addEventListener ( Event.DEACTIVATE, onDeactivate );
function onActivate ( e:Event ):void
{
// restore original frame rate
stage.frameRate = originalFrameRate;
}
function onDeactivate ( e:Event ):void
{
// set frame rate to 0
stage.frameRate = standbyFrameRate;
}
三、尽可能考虑禁用鼠标交互。当屏幕上显示许多交互式对象时,特别是当它们重叠时,检测鼠标交互可能会占用大量 CPU 资源。避免此处理的一种简便方法是对不需要任 何鼠标交互的对象禁用鼠标交互。
四、根据内容是否为动画,选择计时器或 ENTER_FRAME 事件。对于执行时间太长的非动画内容,优先选择计时器,而不是 Event.ENTER_FRAME 事件。计时器调度事件无需考虑帧速率。通过此行为,可实现一些重要优化。TimerEvent 对象中提供的 updateAfterEvent() 方法可以提供更高的更新速率。如果需要,此方法会在每次计时器调度事件时强制更新屏幕。
myTimer.start();
myTimer.addEventListener( TimerEvent.TIMER, updateControls );
function updateControls( e:TimerEvent ):void
{
// Update controls here
// Force the controls to be updated on screen
e.updateAfterEvent();
}
调用 updateAfterEvent() 方法不会修改帧速率。它只强制 Flash Player 更新屏幕上已更改的内容。
将应用程序中 Timer 对象和注册的 enterFrame 处理函数的数量降至最少。
如果有多个操作要在enterframe事件中执行代码,尽量把他们放到一个Enterframe里面执行。同样,如果使用的是 Timer 对象,将产生与从多个 Timer 对象创建和调度事件相关联的开销。
在 enterFrame 事件或 Timer 处理函数中,尽量减少对可导致重绘屏幕的显示对象外观的更改。Timer使用完时,一定及时调用stop方法。
五,尽量限制补间的使用。这可以节省 CPU 处理、内存,在移动设备上时,可以延长电池寿命,并且可以提高低性能移动设备上的运行速度。