actionscript 3 -执行AS3事件.ENTER_FRAME总是在每一帧上运行吗?即使在慢速电脑上



我有一个依赖于ENTER_FRAME事件每次运行的脚本。我注意到在一些较慢的电脑上播放flash电影时可能会有一些延迟。

ENTER_FRAME是否在每一帧上运行,即使它在慢速计算机上?如果flash电影滞后,是否ENTER_FRAME事件仍然运行,渲染只是试图赶上?

ENTER_FRAME上运行代码是每次进入帧时执行代码的可靠方法吗?

是的。每一帧,没有例外。如果某些东西减慢了电影的速度(无论是重脚本还是重图形),它的Event.ENTER_FRAME处理程序仍然在渲染帧之前被执行。

因此,将Timer实例与TimerEvent.TIMER一起使用通常是一个好主意,即使它的延迟被设置为等于电影fps的"理想"帧持续时间。因为timer处理程序不是必须以完全一致的速率触发。

查看以下链接以获得更深入的解释:弹性赛马场

如果你将帧率设置为30fps,那么事件将每秒触发30次,只要你不给处理器施加负载,使帧率下降。因此,如果帧率是波动的,使用计时器Event可能会得到更一致的结果。

顺便说一句,要注意……使用许多事件处理程序也会产生性能问题(如果有太多的话)。每次调用它时,flash至少必须创建一个事件对象。这意味着每次事件触发时都需要分配内存。该内存随后需要在稍后的时间进行垃圾收集,并且垃圾收集也将使用资源来执行。

如果你有很多影片剪辑或精灵,最好有一个控制器来管理它们,而不是每个都有自己的EnterFrame处理程序。

一般问题的一般答案

如果您想提高Flash Player的性能,请考虑以下几点:

  1. 除非必要,否则不要使用笔画。(笔画更占用cpu
    密集)

  2. 使用优化的位图

  3. 有效利用addChild(yourObject), addChildAt(yourObject, index), removeChild(yourObject), removeChildAt(index) .

  4. Event.ADDED_TO_STAGEEvent.REMOVED_FROM_STAGE分别。

  5. addEventListener(somelistener, somefunction);
    removeEventListener (somelistener somefunction);

  6. 收听Event.ACTIVATEEvent.DEACTIVATE.

  7. 如果对象是从外部加载的,那么一定要使用
    unloadAndStop()完全删除不需要的objects从阶段。

如果有人在寻找帧率无关的解决方案,请检查一下…这个家伙真的很聪明,他有一种技术,可以跨多个帧率(较慢的设备,桌面等)保持一致的动画,并保持你的对象的帧率独立于你的时间轴的帧率。点击这里查看。小贴士4 & &;5. 希望这对你有帮助!

我发现定时器类在捣碎按钮时实际上非常不一致,有时计时器只是无法完成一个循环和计时器。COMPLETE事件永远不会到达,如果我有5个100ms的周期,它会在3个周期后停止…此外,帧率会触发每一帧,但它是不一致的!!如果你在CPU上有延迟,你的帧率将下降,因此你将不会定期更新任何内容,而是无论当前帧率是多少。看看那个链接,你甚至可以在你的项目中使用一些帧率代码来检查它。

最新更新