渲染循环 - 最大并行化

时间:2017-06-18 12:01:04

标签: parallel-processing libgdx rendering game-loop

下面是一个UML序列图,显示了我对库libGDX中游戏循环的理解的处理时间。我认为它应该是每个其他游戏库的相同架构。我不确定我是否理解正确。 sequence diagram CP and GPU serial 理论上CPU和GPU并行工作。当CPU等待GPU完成缓冲区更改时,这将使其成为一个串行进程。 如何使我的游戏循环并行工作或者我的理解是错误的?

现在我们想要进行并行化,并且GPU比CPU慢,并且在GPU渲染时CPU继续下一帧。我们有第二个线程等待GPU完成。 GPU完成后,计算下一个图像。 OpenGL状态在哪里发生变化,绘制命令现在如何? GPU现在很忙。这让我得出结论,我错过了一些东西。 sequence diagram parallel Cpu and GPU

编辑:

Ross Vander建议: suggested by Vander

1 个答案:

答案 0 :(得分:1)

我在第二个图中看到的一个问题可能是你出错的地方是GPU似乎返回到CPU线程2,即使它是CPU线程1,它将数据发送到GPU并开始阻塞它。交换前后缓冲区的两个引用不会改变哪个线程在GPU上阻塞。 我认为事件的顺序应该更像这样:CPU线程1将数据从前缓冲区发送到GPU进行渲染。同时,线程2正在写入后缓冲区。当GPU完成时,线程1可以自由交换前后缓冲区(假设线程2已完成),然后将数据发送到GPU。线程2在GPU工作时再次写入后台缓冲区。

更新:取自https://github.com/libgdx/libgdx/wiki/Threading

  

需要执行任何直接涉及OpenGL的图形操作   在渲染线程上。在不同的线程上执行此操作会导致   未定义的行为。这是由于只有OpenGL上下文   在渲染线程上激活。使上下文成为另一个上下文   线程在很多Android设备上都存在问题,因此它就是   不支持的。