2017-06-01 13 views
1

现在我一直在使用GL_MAP_PERSISTENT_BIT和glBufferStorage/glMapBufferRange进行一些工作和测试,我很好奇使用GL_MAP_UNSYNCHRONIZED_BIT是否可以提高性能。正确使用GL_MAP_UNSYNCHRONIZED_BIT与GL_MAP_PERSISTENT_BIT结合使用

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

但答案似乎有点矛盾给我。据说那里你需要同步或者阻止使用这个标志。无论如何,如果我必须同步它,那么将它设置为不同步的重点是什么?此外,我尝试了这种组合,并没有看到任何性能差异。它是否与持久映射缓冲区一起有意义?我从字面上没有发现这种用法的例子。 所提到的话题也说你可以

问题的障碍或刷新缓冲区的区域明确

但我迄今取得使用千方百计这些不仅造成垃圾。

我正在使用目前的三重缓冲,但由于我必须处理非常小的数据块,有时我几乎不能批量处理,所以我不得不发现,在这些情况下,glBufferData往往更快,并且只有(巨大)如果我可以批量生产并减少撤销数量的话,我将受益匪浅。在这里使用GL_MAP_UNSYNCHRONIZED_BIT可能是关键。

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

回答

2

如果我必须在晚些时候同步它,那么将它设置为不同步的意义何在?

点,如通过回答说,是的OpenGL是不是为你做同步。您可以控制何时发生同步。这意味着你可以确保它不会在不适当的时候发生。通过使用你自己的同步,你也可以问这个问题:“你使用缓冲区了吗?”如果没有你自己的同步系统,这不是你可以问的问题。

通过使用非同步映射,您可以停止实现除了同步以外还必须检查自己的内部同步。

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

但是,非同步映射并不会真正影响持久映射,因为......好吧,它是持久性。该功能的全部要点是,你保持缓冲区映射,所以你只打一次电话glMapBufferRange。非同步位只适用于您拨打glMapBufferRange的时刻。

因此,无论您是否使用与您的持久映射调用不同步或基本不相关。

+0

再次,你回答了我需要知道的一切:) – Gnampf