【发布时间】:2011-09-29 22:24:12
【问题描述】:
我有一个脚本,每次运行都依赖于ENTER_FRAME 事件。我注意到在一些速度较慢的计算机上播放 Flash 电影时可能会出现一些延迟。
ENTER_FRAME 是否在每一帧上运行,即使它在慢速计算机上?
如果 Flash 电影滞后,ENTER_FRAME 事件是否仍然运行并且渲染只是试图赶上?
在ENTER_FRAME 上运行代码是每次进入帧时执行代码的可靠方式吗?
【问题讨论】:
我有一个脚本,每次运行都依赖于ENTER_FRAME 事件。我注意到在一些速度较慢的计算机上播放 Flash 电影时可能会出现一些延迟。
ENTER_FRAME 是否在每一帧上运行,即使它在慢速计算机上?
如果 Flash 电影滞后,ENTER_FRAME 事件是否仍然运行并且渲染只是试图赶上?
在ENTER_FRAME 上运行代码是每次进入帧时执行代码的可靠方式吗?
【问题讨论】:
如果有人正在寻找独立于帧速率的解决方案,请查看此内容...这家伙非常聪明,并且拥有一种技术,既可以在多个帧速率(速度较慢的设备、台式机等)上始终如一地制作动画,又可以使对象的帧速率独立于时间轴的帧速率.看看here。提示 4 和 5。希望对您有所帮助!
我发现定时器类在混搭按钮时实际上非常不一致,有时定时器只是无法完成一个周期并且 TIMER.COMPLETE 事件永远不会到达,如果我有 5 个 100 毫秒的周期,它会在 3 后停止周期...此外,帧率将触发每一帧,但它不是一致的!!!如果你的 CPU 有延迟,你的帧率就会下降,因此你不会有任何定期更新的东西,而是不管当前的帧率是多少。查看该链接,您甚至可以在项目中使用一些帧速率代码来检查它。
【讨论】:
一般问题的一般答案。
如果您想提高 Flash Player 的性能,请考虑以下几点,
除非需要,否则不要使用笔画。 (笔画多cpu
密集)
尽可能少用渐变色。
使用优化的位图(如果有)。
有效利用addChild(yourObject)、addChildAt(yourObject, index)、removeChild(yourObject)、removeChildAt(index)。
收听Event.ADDED_TO_STAGE和Event.REMOVED_FROM_STAGE
分别。
收听addEventListener(somelistener, somefunction);
removeEventListener(somelistener, somefunction);
收听Event.ACTIVATE和Event.DEACTIVATE.
如果对象是从外部加载的,请确保使用unloadAndStop() 完全删除不必要的objects
从
舞台。
【讨论】:
是的。每一帧,无一例外。如果有什么东西拖慢了电影的速度(无论是繁重的脚本还是繁重的图形),它Event.ENTER_FRAME 处理程序仍然会在渲染帧之前执行。
因此,将Timer 实例与TimerEvent.TIMER 一起使用通常是一个好主意,即使它的延迟设置为等于电影fps 的“理想”帧持续时间。因为timer 处理程序不一定会以完全相同的速率触发。
更深入的解释见以下链接:The Elastic Racetrack
【讨论】:
Flash Player tries to maintain the amount of calls to TIMER event handler. - 这是不正确的。每隔一段时间(由容器驱动,但通常每 10-50 毫秒左右)Flash 将检查自上次计时器事件以来是否已过相关间隔,如果是,则发出一个。然后它对帧执行相同的操作,然后再等待 10-50 毫秒并重复。它不会尝试维护任何特定的事件顺序或事件类型。
如果您将帧速率设置为 30fps,则事件将每秒触发 30 次,只要您不对处理器施加负载,从而导致帧速率下降。因此,如果帧率在波动,您可能会通过计时器事件获得更一致的结果。
在旁注中,请注意... 使用许多事件处理程序也会产生性能问题(如果你有太多) 每次调用它时,flash 至少必须创建一个事件对象。这意味着您有每次事件触发时都需要分配的内存。之后需要对该内存进行垃圾回收,而垃圾回收也会使用资源来执行。
如果您有许多影片剪辑或精灵,则值得拥有一个控制器来管理所有这些,而不是每个控制器都有自己的 EnterFrame 处理程序。
【讨论】: