【问题标题】:Does AS3 Event.ENTER_FRAME run on every frame, always? Even on slow computers?AS3 Event.ENTER_FRAME 是否总是在每一帧上运行?即使在慢速计算机上?
【发布时间】:2011-09-29 22:24:12
【问题描述】:

我有一个脚本,每次运行都依赖于ENTER_FRAME 事件。我注意到在一些速度较慢的计算机上播放 Flash 电影时可能会出现一些延迟。

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

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

【问题讨论】:

    标签: actionscript-3 flash-cs5


    【解决方案1】:

    如果有人正在寻找独立于帧速率的解决方案,请查看此内容...这家伙非常聪明,并且拥有一种技术,既可以在多个帧速率(速度较慢的设备、台式机等)上始终如一地制作动画,又可以使对象的帧速率独立于时间轴的帧速率.看看here。提示 4 和 5。希望对您有所帮助!

    我发现定时器类在混搭按钮时实际上非常不一致,有时定时器只是无法完成一个周期并且 TIMER.COMPLETE 事件永远不会到达,如果我有 5 个 100 毫秒的周期,它会在 3 后停止周期...此外,帧率将触发每一帧,但它不是一致的!!!如果你的 CPU 有延迟,你的帧率就会下降,因此你不会有任何定期更新的东西,而是不管当前的帧率是多少。查看该链接,您甚至可以在项目中使用一些帧速率代码来检查它。

    【讨论】:

      【解决方案2】:

      一般问题的一般答案。

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

      1. 除非需要,否则不要使用笔画。 (笔画多cpu
        密集)

      2. 尽可能少用渐变色。

      3. 使用优化的位图(如果有)。

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

      5. 收听Event.ADDED_TO_STAGEEvent.REMOVED_FROM_STAGE 分别。

      6. 收听addEventListener(somelistener, somefunction);
        removeEventListener(somelistener, somefunction);

      7. 收听Event.ACTIVATEEvent.DEACTIVATE.

      8. 如果对象是从外部加载的,请确保使用
        unloadAndStop() 完全删除不必要的objects 从 舞台。

      【讨论】:

        【解决方案3】:

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

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

        更深入的解释见以下链接:The Elastic Racetrack

        【讨论】:

        • 你是什么意思,“将 Timer 实例与 TimerEvent.TIMER 一起使用通常是个好主意” 不确定我是否遵循? ——
        • 我认为两者都不太准确。真正重要的部分是跟踪更新之间的增量时间,并使用增量时间来更新您的位置,而不是“每帧”的固定值。如果函数是计时器,则每次运行函数时,增量时间都被简单地“保证”大致相同,而在进入帧循环中,整个渲染过程所需的时间将是多长,这意味着您的增量时间可能会有所不同疯狂地。
        • 通常使用具有理想帧速率的 Timer 是一个好主意,因为当实际帧速率变慢时,您的 Timer 处理程序将进行迭代,其结果永远不会被吸引到屏幕上。在 EnterFrame 处理程序中执行您的逻辑,并在该处理程序中使用 getTimer() 来检查自上次帧更新以来已经过去了多长时间,并采取相应措施。
        • Nox,无论您使用计时器事件或 getTimer 做什么,都可以保证在每次重绘之前获得一个帧事件,因此这是更新视觉效果的正确位置。是否测量每帧的时间增量,以及如何处理该增量,取决于内容和您的目标是什么。但是运行更新屏幕的频率高于或低于屏幕重绘频率的逻辑没有任何价值。
        • 另外:Flash Player tries to maintain the amount of calls to TIMER event handler. - 这是不正确的。每隔一段时间(由容器驱动,但通常每 10-50 毫秒左右)Flash 将检查自上次计时器事件以来是否已过相关间隔,如果是,则发出一个。然后它对帧执行相同的操作,然后再等待 10-50 毫秒并重复。它不会尝试维护任何特定的事件顺序或事件类型。
        【解决方案4】:

        如果您将帧速率设置为 30fps,则事件将每秒触发 30 次,只要您不对处理器施加负载,从而导致帧速率下降。因此,如果帧率在波动,您可能会通过计时器事件获得更一致的结果。

        在旁注中,请注意... 使用许多事件处理程序也会产生性能问题(如果你有太多) 每次调用它时,flash 至少必须创建一个事件对象。这意味着您有每次事件触发时都需要分配的内存。之后需要对该内存进行垃圾回收,而垃圾回收也会使用资源来执行。

        如果您有许多影片剪辑或精灵,则值得拥有一个控制器来管理所有这些,而不是每个控制器都有自己的 EnterFrame 处理程序。

        【讨论】:

        • 确实,在重负载期间,Timer 事件的计时可能会更加一致,但这没有用 - 无论您为响应这些事件所做的任何事情都不会在下一帧之前被绘制到屏幕上。对于更新用户所见内容的任何逻辑,请在帧事件中执行。 (计时器对于您想要较少经常做的事情比帧速率更有用,例如每隔几秒或几分钟。)
        猜你喜欢
        • 1970-01-01
        • 2011-11-10
        • 2020-10-20
        • 1970-01-01
        • 1970-01-01
        • 2013-07-21
        • 2014-01-21
        • 2011-07-01
        • 1970-01-01
        相关资源
        最近更新 更多