我正在使用GL_MAP_UNSYNCHRONIZED_BIT和glMapBufferRange来映射一个缓冲对象。然后将返回的指针传递给工作线程以异步计算新顶点。对象是双缓冲的,因此我可以在写入一个对象时渲染另一个对象。使用GL_MAP_UNSYNCHRONIZED_BIT可以显著提高性能(主要是因为glUnmapBuffer更快地返回),但是我会出现一些视觉伪影(尽管进行了双缓冲),所以我认为GPU开始渲染时DMA上传仍在进行中,或者工作线程开始过早地写入顶点。
如果我正确理解glFenceSync、glWaitSync和glClientWaitSync,则应该按照以下方式解决这些问题:
A: 避免GPU在DMA处理完成之前渲染缓冲对象:在glUnmapBufferRange之后直接在主线程上调用
如果我正确理解glFenceSync、glWaitSync和glClientWaitSync,则应该按照以下方式解决这些问题:
A: 避免GPU在DMA处理完成之前渲染缓冲对象:在glUnmapBufferRange之后直接在主线程上调用
GLsync uploadSync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
glFlush();
glWaitSync(uploadSync, 0, GL_TIMEOUT_IGNORED);
B: 在GPU完成渲染之前,避免在工作线程中向缓冲区写入内容:在glDrawElements调用后,直接在主线程上调用。
GLsync renderSync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
在工作线程上,在开始向先前从glMapBufferRange返回的指针写入数据之前
glClientWaitSync(renderSync,0,100000000);
...start writing to the mapped pointer
1:我的显式同步方法正确吗?
2:如何处理第二种情况?我想在工作线程中等待(不想使主线程停滞),但是我无法从工作线程发出glCommands。除了GL调用之外,是否有另一种方法来检查GLsync是否已被标记为已信号?