【问题标题】:Is it better to count n ticks or run two seperate timers计数 n 滴答声或运行两个单独的计时器更好吗
【发布时间】:2011-09-02 05:38:37
【问题描述】:

我正在制作一个蛇游戏,每滴答作响,蛇都会移动。因为蛇在每个滴答声上移动一个完整的单位,所以动画很跳跃。游戏在一个不可见的网格上,所以蛇只能在特定点改变方向。

如果有一个计时器会被认为是更好的做法,该计时器将一次移动蛇一个像素,并使用变量对其进行计数,并在每个 n 滴答声上运行代码以改变方向。或者最好有两个单独的计时器;一个用于一次移动蛇一个像素,另一个用于改变蛇的方向?

【问题讨论】:

    标签: performance actionscript-3 timer flash-cs5


    【解决方案1】:

    本质上,您正在创建一个“游戏循环”来更新 displayList(在 Actionscript 中)并重新绘制您的视图。当游戏变得复杂时,Timers 和侦听 ENTER_FRAME 事件将受限于 flashplayer 的屏幕刷新设置(即 FPS)和 CPU 基于任务处理的渲染。

    对于与帧速率无关的动画,您可能应该结合使用 ENTER_FRAME 来跟踪毫秒和 GetTimer() 调用,以更准确(到毫秒)调用动画并在各种平台上标准化体验。

    基本上,侦听 ENTER_FRAME 事件,检查自上次更新以来的当前毫秒数,如果它超过了您的刷新率(以毫秒为单位),则启动动画/状态更新:使用 " 检查蛇碰撞检测direction-block" - 如果为真,则处理,然后更新蛇的运动/位置/状态。

    Flash 会根据其设置更新显示列表,以及与 CPU/机器相关的问题。我发现,关键是要确保更新速度正常化,以使体验保持一致。计时器有其用途,但可能会导致内存性能问题。 ENTER_FRAME 与主时间线/帧速率设置同步。

    对于 3 年前的一个过时但有趣的讨论,check out this post from actionscript.org

    【讨论】:

    • 非常有用的信息,但我认为您误解了我的问题。我的蛇一次移动 15 像素,这很令人毛骨悚然,因为它在一瞬间的巨大差异。我想做的是让它一次移动 1px,但每 15 次检查它是否需要改变方向,因为蛇应该沿着由 15x15 像素组成的网格移动。计算滴答声并在每个滴答声中运行 moveSnake 并每 15 个滴答声运行 changeDirection() 是否更好。还是最好有 2 个单独的计时器?
    • 还要注意您的信息计时器和 enter_frame 占用相同的开销。不同之处在于计时器在函数中的代码执行后开始计数,而 enter_frame 基于自启动以来的时间运行。这是非常有用的信息,我不知道所以谢谢。
    • 希望此信息对您有所帮助。我会推荐前者,而不是后者。管理多个计时器很有趣,但归根结底,它并不能很好地重构 (IMO)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多