不确定DX的用语是什么,但我确定他们有类似的想法。
据我所知,VBO的优势在于它们可以分配GPU直接提供的内存。然后,我们可以将数据上传到此缓冲区,并将其保留在那里以获得更多的帧,从而防止每帧上传数据的所有开销。此外,如果我们选择,我们可以在每个数据的基础上更改此数据。
因此,我可以看到将VBO用于静态地理位置的优势,但我看不到动态对象的任何好处 - 因为你几乎不得不每帧都更新所有数据?
答案 0 :(得分:3)
在OpenGL中有几种更新缓冲区的方法。如果您有动态数据,则只需使用新数据(例如glBufferData)每帧重新初始化缓冲区存储。您还可以在兼容性上下文中使用客户端顶点缓冲区指针。但是,这些方法可能会导致驱动程序内存分配中的“流失”。新的数据存储基本上必须放在系统内存中,直到GPU驱动程序处理它为止,并且无法获得有关此过程的反馈。
在后来的OpenGL版本(4.4,以及早期版本中的扩展)中,引入了一些功能来尝试减少更新动态缓冲区的开销,允许在没有直接驱动程序同步的情况下编写GPU分配的内存。这实际上要求您具有glBufferStorage和glMapBufferRange功能。使用GL_DYNAMIC_STORAGE_BIT
创建缓冲区存储,然后将其映射到GL_MAP_PERSISTENT_BIT
(您可能需要其他标记,具体取决于您是否正在读取和/或写入数据)。但是,此技术还要求您使用GPU防护来确保在GPU读取数据时不会覆盖数据。使用此方法可以更新VBO,比重新初始化数据存储或使用客户端缓冲区更有效。
关于此技术的GDC Vault有一个很好的演示(跳到DynamicStreaming标题)。
答案 1 :(得分:2)
AFAIK,通过创建动态顶点缓冲区,您可以为图形适配器驱动程序提供一个提示,将顶点缓冲区放置在内存中,以便CPU快速写入,但GPU读取速度也相当快。驱动程序通常会通过提供非重叠的内存区域来管理它以最小化GPU停顿,以便CPU可以在GPU读取其他内存区域时进行写入。
如果你没有给出提示,它会假设一个静态资源,所以它将被放置在内存中,这样GPU可以快速读/写但CPU写入速度很慢。