我有一个依赖于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的性能,请考虑以下几点:
-
除非必要,否则不要使用笔画。(笔画更占用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
从阶段。
如果有人在寻找帧率无关的解决方案,请检查一下…这个家伙真的很聪明,他有一种技术,可以跨多个帧率(较慢的设备,桌面等)保持一致的动画,并保持你的对象的帧率独立于你的时间轴的帧率。点击这里查看。小贴士4 & &;5. 希望这对你有帮助!
我发现定时器类在捣碎按钮时实际上非常不一致,有时计时器只是无法完成一个循环和计时器。COMPLETE事件永远不会到达,如果我有5个100ms的周期,它会在3个周期后停止…此外,帧率会触发每一帧,但它是不一致的!!如果你在CPU上有延迟,你的帧率将下降,因此你将不会定期更新任何内容,而是无论当前帧率是多少。看看那个链接,你甚至可以在你的项目中使用一些帧率代码来检查它。