编写一个有效的游戏循环

时间:2014-01-25 01:53:12

标签: performance game-loop

我最近在这里问了一个关于游戏编程的问题,因此它会有效且不会滞后。

我做了一个像地狱一样的游戏。我怀疑我编程游戏循环的方式可能是问题的根源。

我想向你描述我游戏中的情况,然后介绍我编程游戏循环的方式。

这是两个玩家的游戏。每个玩家控制一个坦克。每个坦克都可以射击导弹。每个坦克都可以从现场收集“礼物”。

  • tank1 的每枚导弹都会与 tank2 发生碰撞, tank2 的每枚导弹都会与 tank1 发生碰撞。
  • 每枚导弹都可能与屏幕边界发生碰撞。
  • 每个水箱都可能与另一个水箱发生碰撞。
  • 每个坦克都可以与'礼物'碰撞。
  • 所有导弹不断移动。
  • 按下键盘上的特定按钮时,坦克会移动。

我的游戏循环(每个阶段都在游戏循环调用的方法中):

  1. 遍历所有屏幕上的导弹,并更新其位置(移动它们)。
  2. 循环通过所有的tank1导弹,每次检查是否与tank2发生碰撞。
  3. 循环穿过tank2的所有导弹,每次检查是否与tank1发生碰撞。
  4. 遍历所有屏幕上的导弹,并检查是否与屏幕边界发生碰撞。
  5. 检查是否按下键盘上的特定键。如果是这样,请移动坦克。
  6. 检查两个坦克是否发生碰撞。
  7. 遍历屏幕上4个'礼物'的所有,并检查它们是否接触到油箱。
  8. 问题:

    1. 这个游戏循环可能效率低下。效率有多低?一点点,还是很多?
    2. 如何改进游戏循环和/或方法的工作方式?我怎样才能更有效地实现同样的目标呢?
    3. 游戏循环有多大可能成为 导致性能水平不佳的原因?游戏中有多常见的问题是这个问题的根源?
    4. 感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

  1. 我不一定会说它效率低下,因为你只是给我们一些关于在其他几款游戏中可以做些什么的概念。听起来你所做的只是移动物体和检查碰撞,我假设使用AABB碰撞检测。这里没什么特别贵的。当然它还有改进的余地。见#2。

    • 您可能不止一次获得输入,因此您可以做的是在每个帧的开头获取输入并以某种方式存储它。我不知道你正在使用什么形式的输入,但是如果你正在使用键盘,你可以获得并存储WASD键的状态,并在处理油箱输入时检查这些状态。

    • 你可以做的最值得注意的优化是每次导弹循环3次。第一次是移动它们,第二次是检查它们的碰撞,第三次检查它们是否在屏幕外。在一个循环中,您可以移动它们,检查它们是否在屏幕外,然后检查它们是否与对方坦克发生碰撞。我建议按此顺序执行此操作,因为如果子弹碰巧移动到屏幕外,您可以避免进行不必要的碰撞检查。

    • 最后,你只需要检查两个坦克在移动时是否发生碰撞,你只需要做一次。如果你需要它,那么两个坦克相互叠加的每一帧都会发生一些事情,你可以存储碰撞的状态,你只需要在一个坦克移动时再次更新它。

  2. 这取决于。您可能通过睡眠锁定帧速率,因此您可能会睡眠时间过长。尝试删除您的帧速率限制方法,看看会发生什么。