2

I'm writing single threaded game engine for 2D games. Right now my game loop looks rougly like this:

  1. Update game logic
  2. Update physics
  3. Handle collisions
  4. Render scene

I'm using OpenGL for rendering. I'm wondering about 'Render scene' step position in game loop. There is a SwapBuffers() call on the end of the 'Render scene' step, so CPU is blocked until all rendering is finished. What do you think about this game loop:

  1. Render scene (previous frame)
  2. Logic, physics, collisions
  3. Swap buffers

This approach will bring better parallelism between CPU and GPU. Am I right?

4

3 回答 3

2

我知道这已经回答了,但我有一些要补充的。

你在这里提到的

Render scene (previous frame)
Logic, physics, collisions
Swap buffers

可能会提高帧率,但也会大大增加延迟。当用户按下一个按钮时,结果将在最好的情况下超过两帧后首先看到,最坏的情况下最多在 4 帧之后。

更好的游戏循环是:

-Handle Input, move character etc. (This takes virtually no time)
-Render
-Do the heavy calculations (AI, physics)
-Swap Buffers
于 2012-05-21T16:05:52.223 回答
1

我在想,由于渲染是在 OpenGL 中异步发生的,在 GPU 上,GPU 肯定有可能在 CPU 更新逻辑/物理/等时完成渲染。交换缓冲区会等到所有命令都执行完毕,所以最后这样做可能会带来更好的性能。

但是,唯一可以确定的方法是尝试一下。如果CPU是瓶颈,那无论如何都无关紧要。(GPU 的渲染速度比 CPU 发送命令的速度快——这可能发生在高 FPS 的情况下,在这种情况下,它通常不被称为游戏玩家的“瓶颈”,因为 FPS 无论如何都是可以接受的)

于 2012-05-21T14:50:28.173 回答
1

实际上并没有太大的区别。有很多方法可以让你的游戏循环,最重要的是保持 3 个主要主题分开。

-输入 -
逻辑-
渲染

每个之间的时间总是相同的,因为它们不是并行执行的。

于 2012-05-21T03:32:09.347 回答