编写一个高效的游戏循环

问题描述:

我最近在这里问了一个关于编程一个游戏的问题,所以它会高效并且不会滞后。编写一个高效的游戏循环

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

我想向大家介绍一下我的游戏情况,然后介绍一下我的游戏循环编程方式。

这是一个双人游戏。每个玩家控制一辆坦克。每个坦克都可以发射导弹。每个坦克都可以从现场收集'礼物'。

  • 罐1每个导弹可以与TANK2碰撞,以及TANK2每个导弹可以与罐1碰撞。
  • 每个导弹都可以与屏幕边界相撞。
  • 每个坦克都可以与另一个坦克相撞。
  • 每个坦克都可以碰到'礼物'。
  • 所有导弹不断移动。
  • 当按下键盘上的特定按钮时,坦克会移动。

我的游戏循环(每个阶段是从游戏循环中调用方法内):

  1. 环通过屏幕上的所有导弹,并更新其位置(移动它们) 。
  2. 循环通过坦克1的所有导弹的,并且每检查一次是否与坦克2碰撞。
  3. 通过坦克2导弹的全部循环,每检查一次是否与坦克1发生碰撞。
  4. 通过所有屏幕上的导弹循环,并检查是否与屏幕边界碰撞。
  5. 检查是否在键盘上按下特定键。如果是这样,移动坦克。
  6. 检查如果两个坦克相撞。
  7. 循环浏览屏幕上4'礼物'的所有,并检查它们是否碰到水箱。

问题:

  1. 这款游戏环可能是低效的。它有多低效?有点,还是很多?
  2. 我该如何改进游戏循环和/或其方法的工作方式?我怎样才能达到同样的效果?
  3. 游戏循环有多可能是主要导致性能水平不佳?在游戏中这是多么常见的问题的根源呢?

感谢您的帮助。

+0

显示代码。是的,你的游戏循环肯定会成为瓶颈。重构代码可以带来令人惊讶的性能优势。对我而言,这很简单,就像在C#中将所有'for in'循环更改为'for i = 0'循环一样简单。 – 2014-01-25 01:59:33

+0

这将很高兴与此问题的语言标记 – user3125280

+0

@ user3125280我会标记它,但它是相关的吗?我认为这个问题并不是特定语言。 – user3150201

  1. 我不一定会说它效率低下,因为你只是给了我们一些关于在其他几款游戏中可能完成的一般想法。这听起来像你正在做的是移动对象和检查碰撞,我假设使用AABB碰撞检测。这里没什么贵。当然它有改进的余地。见#2。

    • 你可能会获得比一次更投入,所以你可以做的就是输入每一帧的开始,并将其存储在某些方面。我不知道你使用的是什么形式的输入,但是如果你使用的是键盘,你将获得并存储WASD键的状态,并在处理坦克输入时检查这些状态。

    • 你可以做的最显着的优化是你循环遍历每次导弹3次。第一次是移动它们,第二次检查它们的碰撞,第三次检查它们是否在屏幕之外。在一个循环中,你可以移动它们,检查它们是否在屏幕外,然后检查它们是否与相对的坦克相撞。我建议按照这个顺序来做,因为如果子弹碰巧移动到屏幕外面,你可以避免进行不必要的碰撞检查。

    • 最后,你只需要检查两辆坦克在移动时是否碰撞,而你只需要做一次。如果您需要它,所以每个框架都会发生一些事情,两个坦克彼此重叠,您可以存储碰撞的状态,并且只需要在一个坦克移动时再次更新。

  2. 这真的取决于。你可能通过睡觉来锁定帧率,所以你可能会睡得太久。尝试删除您的帧速率限制方法并查看会发生什么情况。