编写高效的游戏循环
Posted
技术标签:
【中文标题】编写高效的游戏循环【英文标题】:Writing an efficient game-loop 【发布时间】:2014-01-25 01:53:12 【问题描述】:我最近在这里问了一个关于游戏编程的问题,以便它高效且不会滞后。
我制作了一款非常滞后的游戏。我怀疑我编写游戏循环的方式可能是问题的根源。
我想向你大致描述一下我的游戏中的情况,然后介绍我编写游戏循环的方法。
这是两个玩家的游戏。每个玩家控制一个坦克。每辆坦克都可以发射导弹。每个坦克都可以从现场收集“礼物”。
tank1的每枚导弹都可以与tank2相撞,tank2的每枚导弹都可以与tank1相撞。 每个导弹都可能与屏幕的边界发生碰撞。 每个坦克都可以与另一个坦克发生碰撞。 每个坦克都可能与“礼物”发生碰撞。 所有导弹都在不断移动。 按下键盘上的特定按钮时,坦克会移动。我的游戏循环(每个阶段都在从游戏循环调用的方法中):
-
循环浏览所有屏幕上的导弹,并更新它们的位置(移动它们)。
遍历所有 tank1 的导弹,并检查每个导弹是否与 tank2 发生碰撞。
遍历所有 tank2 的导弹,并检查每个导弹是否与 tank1 发生碰撞。
遍历所有屏幕上的导弹,并检查是否与屏幕边界发生碰撞。
检查是否按下了键盘上的特定键。如果是这样,移动坦克。
检查两个坦克是否碰撞。
遍历屏幕上所有的 4 个“礼物”,并检查它们是否接触到坦克。
问题:
-
这个游戏循环可能效率低下。它的效率有多低?一点,还是很多?
如何改进游戏循环和/或其方法的工作方式?我怎样才能更有效地实现同样的目标?
游戏循环成为性能水平低下的主要原因的可能性有多大?这在游戏中成为问题根源的情况有多普遍?
感谢您的帮助。
【问题讨论】:
显示代码。是的,您的游戏循环肯定会成为瓶颈。重构代码可以带来惊人的性能优势。对我来说,这就像在 C# 中将所有for in
循环更改为 for i = 0
循环一样简单。
最好用相关语言标记此内容
@user3125280 我会标记它,但它是否相关?我认为这个问题并不是特定于语言的。
@user3150201 可能不是,但它是特定于框架等的。也许你正在使用一些库等或者一种不适合这种事情的语言。
我用的是Java,应该合适。我不想将其标记为 Java,因为我不希望只有 Java 程序员才能看到这里。
【参考方案1】:
我不一定会说它效率低下,因为您只是向我们介绍了其他几款游戏可能会做什么。听起来您所做的只是移动物体并检查碰撞,我假设使用 AABB 碰撞检测。这里没有什么真的很贵。当然它还有改进的空间。见#2。
您可能不止一次获得输入,因此您可以做的是在每一帧的开头获取输入并以某种方式存储它。我不知道您使用的是什么形式的输入,但是如果您使用键盘,例如,您将获取并存储 WASD 键的状态,并在处理油箱输入时检查这些状态。
你可以做的最显着的优化是你循环穿过每个导弹 3 次。第一次是移动它们,第二次是检查它们的碰撞,第三次是检查它们是否在屏幕之外。在一个循环中,您可以移动它们,检查它们是否在屏幕之外,然后检查它们是否与对面的坦克发生碰撞。我建议按此顺序执行此操作,因为如果子弹确实移动到屏幕之外,您可以避免进行不必要的碰撞检查。
最后,你只需要检查两个坦克在移动时是否发生碰撞,你只需要做一次。如果您需要它,以便两辆坦克相互重叠的每一帧都会发生一些事情,您可以存储碰撞状态,并且只需要在一辆坦克移动时再次更新它。
这真的取决于。您可能通过睡眠来锁定帧速率,因此您可能睡眠时间过长。尝试删除您的帧速率限制方法,看看会发生什么。
【讨论】:
以上是关于编写高效的游戏循环的主要内容,如果未能解决你的问题,请参考以下文章