- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用带有 GL_MAP_UNSYNCHRONIZED_BIT 的 glMapBufferRange 来映射缓冲区对象。然后我将返回的指针传递给工作线程以异步计算新顶点。对象是双重缓冲的,因此我可以在写入另一个对象时渲染一个对象。使用 GL_MAP_UNSYNCHRONIZED_BIT 给了我明显更好的性能(主要是因为 glUnmapBuffer 返回得更快),但我得到了一些视觉伪影(尽管有双缓冲) - 所以我假设 GPU 在 DMA 上传仍在进行时开始渲染,或者工作线程过早地开始写入顶点。
如果我正确理解 glFenceSync、glWaitSync 和 glClientWaitSync,那么我应该通过以下方式解决这些问题:
A:避免在 DMA 过程完成之前让 GPU 渲染缓冲区对象:
直接在 glUnmapBufferRange 之后,在主线程上调用
GLsync uploadSync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
glFlush();
glWaitSync(uploadSync, 0, GL_TIMEOUT_IGNORED);
GLsync renderSync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
glClientWaitSync(renderSync,0,100000000);
...start writing to the mapped pointer
最佳答案
您可以做的是在工作线程中创建一个 OpenGL 上下文,然后与主线程共享它。下一个:
Run on the main thread:
GLsync renderSync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
glFlush();
Run on the worker thread:
glClientWaitSync(renderSync,0,100000000);
glFlush
在主线程上很重要,否则您可能会无限等待。另见
OpenGL docs :
4.1.2 Signaling
Footnote 3: The simple flushing behavior defined by SYNC_FLUSH_COMMANDS_BIT will not help when waiting for a fence command issued in another context’s command stream to complete. Applications which block on a fence sync object must take additional steps to assure that the context from which the corresponding fence command was issued has flushed that command to the graphicspipeline.
关于multithreading - OpenGL:单独线程上的 glClientWaitSync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33640702/
我使用带有 GL_MAP_UNSYNCHRONIZED_BIT 的 glMapBufferRange 来映射缓冲区对象。然后我将返回的指针传递给工作线程以异步计算新顶点。对象是双重缓冲的,因此我可以在
在我的渲染引擎中,我使用 glMapSubBuffer 以及孤立和栅栏实现了三重缓冲来更新着色器缓冲区。在 Windows 中一切正常,但当我在 Mac 上运行引擎时出现问题。当我调用 glClien
运行有区别吗 glFinish() 正在运行 glFenceSync(...) glClientWaitSync(...) 超时时间长吗? 我正在尝试做的事情:我运行一个 OpenGL 命令管道,我想
我不清楚 Sync objects 上的 OpenGL 规范,是否使用 glGetSynciv 或 glClientWaitSync 以防我想在不等待的情况下检查同步对象的信号。以下两个命令在行为和性
我是一名优秀的程序员,十分优秀!