Flash 平台技术的优化(六) 计时器与 ENTER_FRAME 事件

根据内容是否为动画,选择计时器或 ENTER_FRAME 事件。
对于执行时间太长的非动画内容,优先选择计时器,而不是 Event.ENTER_FRAME 事件。
在 ActionScript 3.0 中,有两种方法可以特定的间隔调用函数。第一种方法是使用由交互式对象 (InteractiveObject) 调度的Event.ENTER_FRAME 事件。第二种方法是使用计时器。ActionScript 开发人员通常使用 ENTER_FRAME 事件方法。需要对每个帧调度 ENTER_FRAME 事件。因此,调用函数的间隔与当前帧速率有关。可通过 Stage.frameRate 属性来查看帧速率。然
而,在某些情况下,使用计时器比使用 ENTER_FRAME 事件更合适。例如,如果您没有使用动画,但又想以特定的间隔调用代码,则使用计时器可能是更好的选择。
计时器的行为与 ENTER_FRAME 事件的行为类似,但是调度事件无需考虑帧速率。通过此行为,可实现一些重要优化。以视频播放器应用程序为例。在这种情况下,由于仅移动应用程序控件,不需要使用高帧速率。
注: 帧速率不影响视频,因为视频未嵌入时间轴中。视频是通过渐进式下载或流式下载动态加载的。
在此示例中,帧速率设置为一个较低的值 10 fps。计时器以每秒一次的速度更新控件。TimerEvent 对象中提供的updateAfterEvent() 方法可以提供更高的更新速率。如果需要,此方法会在每次计时器调度事件时强制更新屏幕。以下代码演示
了这一概念:

// Use a low frame rate for the application
stage.frameRate = 10;
// Choose one update per second
var updateInterval:int = 1000;
var myTimer:Timer = new Timer(updateInterval,0);
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 更新屏幕上已更改的内容。时间轴仍以 10 fps 的速度运行。请记住,在低性能设备上,或者事件处理函数包含要求进行大量处理的代码时,计时器和 ENTER_FRAME 事件并不完全
精确。就像 SWF 文件帧速率一样,计时器的更新帧速率随情况的不同而不同。
将应用程序中 Timer 对象和注册的 enterFrame 处理函数的数量降至最少。
对于每个帧,运行时将为其显示列表中的每个显示对象调度一个 enterFrame 事件。尽管您可以使用多个显示对象为enterFrame
事件注册侦听器,但这样做意味着将在每个帧上执行更多代码。或者,考虑使用一个集中的 enterFrame 处理函数,该函数执行要运行每个帧需要的所有代码。通过集中此类代码,更容易管理所有频繁运行的代码。
同样,如果使用的是 Timer 对象,将产生与从多个 Timer 对象创建和调度事件相关联的开销。如果您必须在不同的时间间隔触发不同的操作,以下提供了一些建议的替代方法:
• 根据其发生的频率,使用最少数量的 Timer 对象和组操作
例如,将一个 Timer 对象用于频繁执行的操作,设置为每 100 毫秒触发一次。将另一个 Timer 对象用于频率较低的操作或后台操作,设置为每 2000 毫秒触发一次。
• 使用一个 Timer 对象,并以 Timer 对象的 delay 属性时间间隔的倍数触发操作。
例如,假设您希望某些操作每 100 毫秒发生一次,而其他操作每 200 毫秒发生一次。在这种情况下,请使用一个 delay 值为100 毫秒的 Timer 对象。在 timer 事件处理函数中,添加一个条件语句,即仅每隔一次运行一次时间间隔为 200 毫秒的操作。以下示例对此技术进行了演示:
var timer:Timer = new Timer(100);
timer.addEventListener(TimerEvent.Timer, timerHandler);
timer.start();
var offCycle:Boolean = true;
function timerHandler(event:TimerEvent):void
{
// Do things that happen every 100 ms
if (!offCycle)
{
// Do things that happen every 200 ms
}
offCycle = !offCycle;
}
停止未使用的 Timer 对象。

如果 Timer 对象的 timer 事件处理函数仅在特定的条件下执行操作,则当不符合这些条件时调用 Timer 对象的 stop() 方法。在 enterFrame 事件或 Timer 处理函数中,尽量减少对可导致重绘屏幕的显示对象外观的更改。
对于每个帧,呈现阶段都将重绘在该帧期间更改的舞台部分。如果重绘区域很大,或者很小但包含大量或复杂的显示对象,则运行时需要更多时间才能呈现。要测试需要重绘的量,请使用 Flash Player 调试版或 AIR 中的“ 显示重绘区域” 功能。
有关提高重复操作的性能的详细信息,请参阅以下文章:
• Writing well-behaved, efficient, AIR applications (Arno Gourdol 编写的文章和示例应用程序)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值