更新VBO中的顶点数据(glBufferSubData vs glMapBuffer)

Mar*_*ram 14 opengl vertex-buffer

我想在创建VBO后更新对象的顶点列表.我已经看到了两者glBufferSubData并且glMapBuffer它们似乎都做了类似的事情,这意味着我现在不确定使用哪一个.

我的伪工作流程是:

创建对象
开始顶点更新(使用data = nullptr调用glBufferData)
更新对象的顶点
结束顶点更新(采用更新的顶点和调用glBufferSubDataglMapBuffer)

Cal*_*602 22

两者都有效.

如果您打算经常更新顶点(每一帧左右),我建议避免使用glBufferSubData,这需要在驱动程序中再添加一个memcpy.glMapBuffer/glMapBufferRange通常会让你获得更多的性能.

如果你很少更新,glBufferSubData就可以了.

另见OpenGL Insights的第28章(免费:http://openglinsights.com/)

  • gl ...数据并不是绝对需要复制数据.一个好的驱动程序将只显示页面并从已分配的内存中进行直接DMA传输.在我最近写的驱动程序(不是图形)中,它发生的确如此. (4认同)
  • @ Calvin1602:根据使用的分配器,删除/免费只会取消映射页面.在这种情况下,将删除一个CoW引用,这意味着驱动程序修改数据将不再触发重复.每页也会发生重复,而不是完整数据.但是,来自内存池的标准malloc/new callocate,在free/delete时没有交回操作系统.所以这就是glMapBuffer效率更高的情况.但是,如果您的数据来自mmap-ed文件或类似文件,则glBufferData是首选方法. (2认同)