下面是一个UML序列图,显示了我对库libGDX中游戏循环的理解的处理时间。我认为它应该是每个其他游戏库的相同架构。我不确定我是否理解正确。 理论上CPU和GPU并行工作。当CPU等待GPU完成缓冲区更改时,这将使其成为一个串行进程。 如何使我的游戏循环并行工作或者我的理解是错误的?
现在我们想要进行并行化,并且GPU比CPU慢,并且在GPU渲染时CPU继续下一帧。我们有第二个线程等待GPU完成。 GPU完成后,计算下一个图像。 OpenGL状态在哪里发生变化,绘制命令现在如何? GPU现在很忙。这让我得出结论,我错过了一些东西。
编辑:
答案 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设备上都存在问题,因此它就是 不支持的。