gpt4 book ai didi

c++ - 如何将 GL_MAP_UNSYNCHRONIZED_BIT 与 GL_MAP_PERSISTENT_BIT 一起使用?

转载 作者:太空狗 更新时间:2023-10-29 20:52:59 28 4
gpt4 key购买 nike

我一直在使用 GL_MAP_PERSISTENT_BIT 和 glBufferStorage/glMapBufferRange。我很好奇使用 GL_MAP_UNSYNCHRONIZED_BIT 是否可以提高性能。

我已经找到了Opengl Unsynchronized/Non-blocking Map

但这个答案对我来说似乎有点矛盾。那里说使用此标志时需要同步或阻止。如果我以后必须同步它,那么将它设置为不同步有什么意义呢?我也尝试了这种组合,但没有看到任何性能差异。它与持久映射缓冲区一起使用是否有意义?我几乎没有找到关于这种用法的例子。提到的主题还说你可以

issue a barrier or flush that region of the buffer explicitly

但到目前为止,我使用这些所做的每一次尝试都只会导致垃圾。

我目前正在使用三重缓冲,但由于有时我必须处理非常小的数据 block ,我几乎无法批处理,所以我不得不发现 glBufferData 在这些情况下通常更快,而持久缓冲区只有(巨大的)好处如果我可以批处理并减少 drawcalls 的数量。使用 GL_MAP_UNSYNCHRONIZED_BIT 可能是这里的关键。

任何人都可以给我一个工作示例,以防它在这种组合中有意义吗?

最佳答案

What is the point of setting it unsynchronized if I have to sync it later then anyway?

如该回答所述,关键是 OpenGL 没有为您进行同步。您可以控制同步发生的时间。这意味着您可以确保它不会在不合适的时间发生。通过使用您自己的同步,您还可以提出这样的问题:“您使用完缓冲区了吗?”如果没有自己的同步系统,这不是你可以问的问题。

通过使用非同步映射,除了您的同步之外,您不再需要检查其自身的内部同步。

但是,您链接到的答案主要适用于非持久映射(因为这就是问题所在)。非同步映射仅适用于映射调用本身。它会阻止 GL 由于您调用 glMapBufferRange 而发出内部同步。

但非同步映射并不会真正影响持久映射,因为...好吧,它是持久的。该功能的全部意义在于保持缓冲区映射,因此您只需调用一次 glMapBufferRange。并且非同步位仅在您调用 glMapBufferRange 时适用。

因此,您是否对持久映射调用使用非同步本质上是无关紧要的。

关于c++ - 如何将 GL_MAP_UNSYNCHRONIZED_BIT 与 GL_MAP_PERSISTENT_BIT 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44299324/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com