将open gl与应用程序代码同步

时间:2015-01-02 13:27:35

标签: android c++ multithreading opengl-es

我使用c / c ++(NDK)

在Android上使用open gl es 2.0制作这个游戏

作为游戏中最重要的东西,我为游戏循环制定了两个方案!

方案1系列方案:

enter image description here

步骤a。 游戏读取输入并更新状态和物理

步骤b。在步骤a完成后,使用步骤a中的数据集绘制图形

方案2并行方案:

enter image description here

步骤a。线程(线程A)持续读取输入并持续更新游戏状态和物理

步骤b。另一个线程(线程B)使用开放式GL绘制调用(最多设置fps)从线程A生成的数据中绘制

问题 方案1:

方案1的问题在于我不知道在场景中有很多对象的情况下会发生什么,因此GPU中的实际绘制操作(不是GL api调用)花费的时间比所需的帧时间长(比如1/60秒)。

由于大多数openGL Api调用立即返回,这可能会导致下一帧被绘制的错觉,而实际上最后一帧绘制仍然在进行,而循环发出下一帧绘制调用。

因此,绘制调用将叠加并可能达到限制。在那个限制会发生什么?它会阻止进一步的api通话还是掉线或其他什么?

方案2:

在方案2中,问题类似。当您发出绘制调用时,您必须将输入/更新线程置于休眠状态,以便游戏状态在绘制过程中不会发生变化。因此,当您的绘制操作比计算的帧延迟更长时,您将如何实现帧丢弃,因为绘制调用将立即返回?

编辑:有很多"可能" "应该"和#34;大多数"在this official page这样的人怎么能确定一切?

看起来openGL规范没有关于如何利用并行处理或线程进行同步的平台或实现独立指南!他们怎么能错过呢?

1 个答案:

答案 0 :(得分:0)

从GPU执行的角度来看,您的两个设置基本相同。正如其他评论所建议的那样,如果命令缓冲区过载(例如,您发出了太多的状态更改操作),驱动程序可能(必须)停止执行GL命令。这在很大程度上取决于驱动程序的实现,并且很难在这些停顿发生时提前确定,因为您不了解驱动程序的命令缓冲区实现。您必须依赖于这种情况,并且实施细节对您隐藏。

如果您非常关心CPU / GPU同步,可以使用glFenceSync + glClientWaitFence(https://www.khronos.org/opengles/sdk/docs/man3/html/glFenceSync.xhtml)来确定GPU何时完成GPU命令的处理,直到插入栅栏的位置,以及(可能)等到这些命令完成。例如,如果第N帧前一帧的栅栏尚未完成,则可能会停止CPU。通常,在您描述的情况下,这不是必需的,它通常仅用于CPU和GPU具有对同一资源的不同步访问的情况(例如,使用glMapBufferRange + GL_MAP_UNSYNCHRONIZED_BIT)。