将Vertex Buffer Object用于非常动态的数据是一个好主意吗?

Ari*_*nen 17 iphone graphics opengl-es vbo

我有许多粒子,每个帧都会改变顶点.当前正在使用"客户端"内存中的顶点数组绘制顶点.如果我使用顶点缓冲区对象,我可以期待什么性能特征?

因为我必须使用一些glBuffersubData来更新粒子顶点,所以我无论如何都要将每个帧的顶点转移到视频内存(就像我使用常规顶点数组一样)?在这种情况下,VBO有什么好处吗?

这适用于iOS设备.实际的绘制调用:glDrawElements(GL_POINTS,num_particles,GL_UNSIGNED_SHORT,pindices);

我应该使用GL_STREAM_DRAWGL_DYNAMIC_DRAW

Tom*_*mmy 5

Apple的文档似乎建议在任何情况下都使用VBO。如果您使用的是ES 2.x,则GL_STREAM_DRAW顶点缓冲区类型明确适用于“当您的应用程序需要创建呈现少量次数然后被丢弃的瞬态几何图形时。这在您的应用程序必须动态更改顶点时非常有用。以无法在顶点着色器中执行的方式在每个帧中记录数据。” 然后直接提倡使用glBufferSubData。

从逻辑上讲,我认为完全重新提供数据并将其发送到现有的GL_STREAM_DRAW或GL_DYNAMIC_DRAW缓冲区之间的唯一区别是,内存映射中的空间(GPU或CPU,取决于芯片— MBX并不是真正的VBO,而是Apple出于其他性能原因支持它们)可以分配一次,而不是在每个帧中分配和释放。

与切换到VBO相比,使用该文档中给出的对齐和打包技巧可能会带来更好的改进,因为否则,CPU只需在glDrawElements上解压缩和重新打包数据即可。尽管您很可能已经意识到了这一点,并且我很欣赏它不是问题的直接部分-我主要将其作为对性能优势的比较猜测。


BЈо*_*вић 2

通过正确设置 VBO,您可以使用最佳方式将数据传输到 GPU。通过这样做,您可能会跳过一些驱动程序处理。要了解自己取得了多大的进步,唯一的方法就是进行衡量。每张卡的情况都不同。

有关 VBO 操作方法,请参阅: VBO 教程

编辑 忘记回答问题:是的,这是个好主意。但首先要衡量。