我一直在使用 GL_MAP_PERSISTENT_BIT 和 glBufferStorage/glMapBufferRange。我很好奇使用 GL_MAP_UNSYNCHRONIZED_BIT 是否可以提高性能。
我已经找到了Opengl Unsynchronized/Non-blocking Map
但这个答案对我来说似乎有点矛盾。据说使用此标志时需要同步或阻止。如果我稍后必须同步它,那么将其设置为不同步有什么意义呢?我也尝试了这种组合,但没有看到任何性能差异。它与持久映射缓冲区一起有意义吗?我确实没有找到关于这种用法的例子。提到的主题还说你可以
发出屏障或显式刷新缓冲区的该区域
但到目前为止,我使用这些方法所做的每一次尝试都只会导致垃圾。
我目前正在使用三重缓冲,但由于有时我必须处理非常小的数据块,而我几乎无法批量处理这些数据,因此我必须发现 glBufferData 在这些情况下通常更快,并且如果可以的话,持久缓冲区只有(巨大)好处批量并减少绘制调用的数量。使用 GL_MAP_UNSYNCHRONIZED_BIT 可能是这里的关键。
谁能给我一个可行的例子,以防它在这种组合中有意义?
如果我稍后必须同步它,那么将其设置为不同步有什么意义呢?
正如该答案所述,重点是OpenGL不会为您执行同步。您可以控制同步发生的时间。这意味着您可以确保它不会在不适当的时间发生。通过使用您自己的同步,您还可以提出这样的问题:“您使用完缓冲区了吗?” 如果没有自己的同步系统,您就无法提出这个问题。
通过使用不同步映射,您可以让实现除了同步之外还必须检查其自己的内部同步。
但是,您链接到的答案主要适用于非持久映射(因为这就是问题所在)。非同步映射仅适用于映射调用本身。它可以防止 GL 由于您调用而发出内部同步glMapBufferRange。
但不同步映射并不会真正影响持久映射,因为……嗯,它是持久的。该功能的全部要点是您保持缓冲区映射,因此您只需调用glMapBufferRange一次。并且非同步位仅在您调用时适用glMapBufferRange。
因此,是否使用非同步与持久映射调用本质上是无关的。