1

我的问题是关于 opengl 中的游戏循环设计。

我相信可以通过 3 个主要步骤来消除游戏循环

  1. 接受输入 - 它可能来自用户点击屏幕或系统警报,或其他任何内容。
  2. 做逻辑
  3. 更新视图

为了简单起见,让我们只关注第 2 步和第 3 步。

我认为以并行顺序运行它们或将它们混合到一个步骤中是错误的。我给你一个例子。

lats说你在做一个战争游戏,你需要在屏幕上画100个战斗的士兵,逻辑是更新他们的位置,更新背景区域,然后你需要绘制结果。在更新另一名士兵的位置之前,您不能开始绘制一名士兵。

所以根据这个简单的步骤,很明显第 2 步和第 3 步需要以某种方式同步,并且第 2 步必须在第 3 步之前完成。

现在告诉我如何在多个线程和多个进程上运行游戏循环?opnegl 是否使用多核?如何?

编辑:使用多线程的一种方法是预先计算游戏逻辑,或者换句话说,使用向量。但是向量有两个很大的缺点,使得它们几乎不被推荐使用。

  1. 有时你不想改变你的向量,所以你做了很多计算,你不会使用它们
  2. 在大多数情况下,您试图达到 60+ FPS,这意味着游戏循环需要 16 毫秒,切换线程需要某种同步,任何同步都对性能不利,据我所见,即使是简单的 Handler.post()在 android 中(只是将任务添加到队列以在其他线程上运行)可能需要 3 毫秒(帧速率时间的 18%),所以除非你的计算需要更长的时间,否则不要这样做!现在我没有发现任何需要花费这么多时间的东西。
4

2 回答 2

3

现在告诉我如何在多个线程上运行游戏循环

多核计算的理念是并行化,即将计算密集型任务拆分为可以并行处理的独立工作集。正如您自己发现的那样,游戏的并行化空间非常小。

在游戏中使用多核的常用方法是将 I/O 与逻辑操作并行化。即在一个线程中进行所有网络和用户交互,在另一个线程中进行 AI 和场景管理。声音通常也被并行化了。

OpenGL 是否使用多核?如何?

OpenGL 规范没有指定这一点。但是一些实现可能会选择使用多个内核。虽然这不太可能。为什么?因为它会产生不必要的缓存管理开销。

于 2012-05-04T09:14:50.427 回答
2

我将尝试以图形方式解释为什么 2 个线程,一个用于渲染,一个用于逻辑,并且不会导致不一致:

您提出的单线程设计将按如下方式运行:

logic    |-----|     |-----|
graphics       |-----|     |-----| and so forth.

但由于您有多个 cpu,您应该使用它们。这意味着,在逻辑第一次完成后,图形可以渲染该游戏状态。同时,可以计算下一个逻辑步骤:

logic    |-----||-----||-----|
graphics       |-----||-----|    and so forth.

如您所见,通过这种方式几乎可以使性能翻倍:当然会有一些开销,但无论如何它都会比单线程版本快。

此外,您可以假设,游戏逻辑将花费更少的时间来计算渲染线程:这使得线程非常容易,因为您可以在逻辑线程中等待来自渲染线程的回调以给渲染线程新的指令和然后计算下一个逻辑步骤。

于 2012-05-04T09:44:40.657 回答