利用 openGL 的多线程优势

All*_*ane 5 c++ multithreading android opengl-es

以基于 openGL 渲染器的游戏为背景进行讨论:

假设有两个线程:

  1. 更新游戏中对象的游戏逻辑和物理等

  2. 根据游戏对象中的数据对每个游戏对象进行 openGL 绘制调用(线程 1 不断更新)

除非您在游戏的当前状态下拥有每个游戏对象的两个副本,否则您必须在线程 2 进行绘制调用时暂停线程 1,否则游戏对象将在该对象的绘制调用中间更新!这是不可取的!

但是停止线程 1 以安全地从线程 2 进行绘制调用会破坏多线程/并发的全部目的

除了使用数百或数千个或同步对象/栅栏以便利用多核架构来提高性能之外,是否有更好的方法?

我知道我仍然可以使用多线程来加载纹理并为尚未成为当前游戏状态一部分的对象编译着色器,但是如何对活动/可见对象执行此操作而不导致与绘制和更新发生冲突?

dat*_*olf 4

通常的方法是,模拟线程在完成游戏步骤后将状态提交到中间缓冲区,然后向渲染器线程发出信号。由于 OpenGL 异步执行,渲染线程应该很快完成,从而释放下一个状态的中间缓冲区。

无论如何,您不应该直接从游戏状态进行渲染,因为渲染器完成其工作所需的内容和模拟生成的内容并不总是相同的。所以无论如何,一些映射可能是必要的。