如何在opengl游戏循环中使用双核?

时间:2012-05-04 08:46:31

标签: android opengl-es core-graphics game-loop

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

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

  1. 接受输入 - 可能来自用户点击屏幕或系统警报,或其他任何内容。
  2. 做逻辑
  3. 更新视图
  4. 为了简单起见,我们只关注第2步和第3步。

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

    Lats说你正在创造一个战争游戏,你需要在屏幕上绘制100名战士,逻辑将更新他们的位置,更新背景区域,然后你需要绘制结果。在更新另一名士兵的位置之前,你无法开始画一名士兵。

    所以按照这个简单的步骤,很明显第2步和第3步需要同步一些,第2步必须在第3步之前完成。

    现在告诉我如何在多个线程上运行游戏循环,以及多个进程? opnegl使用multiCore吗?怎么样?

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

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

2 个答案:

答案 0 :(得分:3)

  

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

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

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

  

OpenGL是否使用multiCore?怎么样?

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

答案 1 :(得分:2)

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

您建议的单线程设计运行如下:

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

但是因为你有多个cpus,你应该使用它们。这意味着,在逻辑第一次完成之后,图形可以呈现该游戏状态。同时,可以计算下一个逻辑步骤:

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

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

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