我正在用 AS3 制作一款游戏,需要在极短的时间内依次发射大量子弹。例如,在某个时刻,我需要每隔 1-5 毫秒发射一颗子弹,持续大约 1 秒。游戏以 60 FPS 的速度(流畅地)运行,屏幕上有大约 800 多个对象,但计时器似乎无法比我的帧速率更快(大约每 16 毫秒一次)。我只有一个 enterFrame,其他所有内容都从它更新。
有小费吗?
我正在用 AS3 制作一款游戏,需要在极短的时间内依次发射大量子弹。例如,在某个时刻,我需要每隔 1-5 毫秒发射一颗子弹,持续大约 1 秒。游戏以 60 FPS 的速度(流畅地)运行,屏幕上有大约 800 多个对象,但计时器似乎无法比我的帧速率更快(大约每 16 毫秒一次)。我只有一个 enterFrame,其他所有内容都从它更新。
有小费吗?
屏幕上怎么可能有 800 多个对象?每个对象是单个像素还是整个屏幕都刚刚填满?我的意思是公平地说,我面前有一个 1920x1080 的屏幕,所以每个对象可能是 2 像素宽和 2 像素高,它不会完全填满 1600x1600 的整个屏幕宽度。我只是好奇你为什么会有这样的场景,因为我一直在玩游戏开发。
至于技术问题,定时器不能保证在持续时间到期后的那一刻被触发(就在一段时间之后),这取决于它能够多快处理定时器滴答的代码。我的猜测是有这么多对象会耗尽 CPU(在 *NIX 系统上使用控制台中的 top 来查看或在 Windows 中使用任务管理器是否会达到 CPU 核心的峰值?)。这可能会确认或拒绝它,或者如果您关闭对象的创建/更新并查看计时器本身是否以正确的速率滴答作响。如果其中任何一个为真,则表明 CPU 正在达到峰值。
考虑使用 Stage3D 将对象绘图卸载到 GPU 以释放 CPU 来运行您的计时器。您可能还想考虑使用像 flixel 这样的“游戏框架”来帮助管理您的资源,尽管我不知道它利用了 GPU ......实际上只是在谷歌上搜索并发现了一篇有趣的帖子讨论它:
16 毫秒听起来是对的……根据文档,它的分辨率不小于 16.6 秒。
delay:Number — 计时器事件之间的延迟,以毫秒为单位。不推荐低于 20 毫秒的延迟。定时器频率限制为每秒 60 帧,这意味着低于 16.6 毫秒的延迟会导致运行时问题。
我建议您在每个刻度上以不同的偏移量在屏幕外创建 x 个对象(子弹),以便在 1 秒内获得所需数量的对象。这假设您的上下文允许屏幕外的敌人射击。