【问题标题】:Timers in AS3 can not tick fast enoughAS3 中的计时器计时不够快
【发布时间】:2012-06-03 06:15:08
【问题描述】:

我正在用 AS3 制作一款游戏,需要在极短的时间内依次发射大量子弹。例如,在某个时刻,我需要每隔 1-5 毫秒发射一颗子弹,持续大约 1 秒。游戏以 60 FPS 的速度(流畅地)运行,屏幕上有大约 800 多个对象,但计时器似乎无法比我的帧速率更快(大约每 16 毫秒一次)。我只有一个 enterFrame 正在运行,其他所有内容都从它更新。

有什么建议吗?

【问题讨论】:

  • 查看@JasonSturges 在此处针对我的一个专门讨论性能的问题发布的答案:stackoverflow.com/questions/8380789/… 您可能会得到一些提高游戏性能的建议。但要记住的是,Flash Player 的功能不足以满足您的需求 - 使用 Flash 构建的游戏可以访问的资源远少于使用 C# 或类似游戏的典型游戏。

标签: actionscript-3 actionscript timer


【解决方案1】:

16 毫秒听起来差不多……According to the docs 它的分辨率不小于 16.6 秒。

delay:Number — 计时器事件之间的延迟,以毫秒为单位。不推荐低于 20 毫秒的延迟。定时器频率限制为每秒 60 帧,这意味着低于 16.6 毫秒的延迟会导致运行时问题。

我建议您在每个刻度上以不同的偏移量在屏幕外创建 x 个对象(子弹),以便在 1 秒内获得所需数量的对象。这假设您的上下文允许屏幕外的敌人射击。

【讨论】:

    【解决方案2】:

    屏幕上怎么可能有 800 多个对象?每个对象是单个像素还是整个屏幕都刚刚填满?我的意思是公平地说,我面前有一个 1920x1080 的屏幕,所以每个对象可能是 2 像素宽和 2 像素高,它不会完全填满 1600x1600 的整个屏幕宽度。我只是好奇你为什么会有这样的场景,因为我一直在玩游戏开发。

    至于技术问题,定时器不能保证在持续时间到期后的那一刻被触发(就在一段时间之后),这取决于它能够以多快的速度处理定时器滴答的代码。我的猜测是有这么多的对象会耗尽 CPU(在 *NIX 系统上使用控制台中的顶部来查看或在 Windows 中使用任务管理器是否会达到 CPU 核心的峰值?)。这可能会确认或拒绝它,或者如果您关闭对象的创建/更新并查看计时器本身是否以正确的速率滴答作响。如果其中任何一个为真,则表明 CPU 正在达到峰值。

    考虑使用 Stage3D 将对象绘图卸载到 GPU 以释放 CPU 来运行您的计时器。您可能还想考虑使用像 flixel 这样的“游戏框架”来帮助管理您的资源,尽管我不知道它利用了 GPU...实际上只是在 Google 上搜索并发现了一篇有趣的帖子讨论它:

    http://forums.flixel.org/index.php?topic=6101.0

    【讨论】:

    • 对象范围从 5x5 到 100x100,有很多重叠,请查找 Mushihimesama 和 Dodonpachi 等游戏。我会调查一下,你说的也是我的想法,想知道有没有办法解决。
    • 是的,我怀疑你是否能够在不使用 Stage3D 类的情况下实现这一点......关于这一点需要注意几点,它需要 FP11,它要求 GPU 可以通过上述方式访问FP11 并非所有显卡都如此......这是一个教程active.tutsplus.com/tutorials/games/…,这个人列出了一些不受支持的显卡mcfunkypants.com/2011/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 2019-11-28
    • 1970-01-01
    相关资源
    最近更新 更多