繁体   English   中英

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

[英]How is it possible to use dual core in opengl game loop?

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

我相信游戏循环可以通过3个主要步骤完成

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

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

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

老兄说,您正在创建一个战争游戏,您需要在屏幕上绘制100名战士,逻辑将是更新其位置,更新背景区域,然后绘制结果。 在更新另一位士兵的位置之前,您不能开始绘制一位士兵。

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

现在告诉我,如何可能在一个以上线程和一个以上进程上运行游戏循环? opnegl是否使用multiCore? 怎么样?

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

  1. 有时您不希望更改向量,因此您进行了大量计算,因此您将不使用它们
  2. 在大多数情况下,您试图达到60+ FPS,而游戏循环的平均时间为16毫秒,切换线程需要某种同步,从我看来,任何同步都不利于性能,甚至是简单的Handler.post()在android中(仅将任务添加到队列以在其他线程上运行)可能需要3毫秒(比您的帧速率时间多18%),因​​此除非您的计算花费更长的时间,否则不要这样做! 到目前为止,我没有发现花费这么多时间的东西。

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

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

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

OpenGL是否使用multiCore? 怎么样?

OpenGL规范未指定。 但是某些实现可能选择利用多个内核。 尽管这不太可能。 为什么? 因为这会产生不必要的缓存管理开销。

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

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

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

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

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

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

此外,您可以假设游戏逻辑将比渲染线程花费更少的时间:这使线程变得相当容易,因为您可以在逻辑线程中等待从renderthread进行的回调,从而为渲染线程提供新的指令并然后计算下一个逻辑步骤。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM