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

Posted

技术标签:

【中文标题】如何在opengl游戏循环中使用双核?【英文标题】:How is it possible to use dual core in opengl game loop? 【发布时间】:2012-05-04 08:46:30 【问题描述】:

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

这个问题可能最好在gamedev.se 上回答。 【参考方案1】:

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

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

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

OpenGL 是否使用多核?怎么样?

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

【讨论】:

说得好,但你只说显而易见的,今天大多数电脑甚至手机都配备不止一个内核(今天你可以在苹果电脑中找到 12 个内核),计算机工程师努力为我们提供更多的核心。我们,开发人员,以及那些日子最需要的游戏开发人员,并不总是可以使用它。我想让人们对此敞开心扉,真正的性能是什么,有没有可能这么多工程师白白地在内核上工作……PS SP3 有 7 个内核,它是一个游戏机。 @Baibu:嗯,Cell SPU 可以用于 AI 并行化或音效等事情。物理模拟也可以很好地并行化。【参考方案2】:

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

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

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

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

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

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

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

【讨论】:

以上是关于如何在opengl游戏循环中使用双核?的主要内容,如果未能解决你的问题,请参考以下文章

Android Gameloop (openGL ES 2.0) 的问题

如何在第三方进程中隔离我自己的 OpenGL 调用?

如何只使用SDL编写的游戏OpenGL代码的一部分?

从酷睿双核到Tiger Lake-H,英特尔如何帮游戏笔记本完成蜕变

从酷睿双核到Tiger Lake-H,英特尔如何帮游戏笔记本完成蜕变

如何仅将部分 OpenGL 代码实现到使用 SDL 编写的游戏中?