17

我有很多粒子,每帧的顶点都会改变。当前正在使用“客户端”内存中的顶点数组绘制顶点。如果我使用顶点缓冲区对象,我可以获得哪些性能特征?

由于我必须使用许多 glBuffersubData 来更新粒子顶点,因此我无论如何都要将顶点传输到视频内存每一帧(就像我使用常规顶点数组一样)?在这种情况下,VBO 有什么好处吗?

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

我应该使用GL_STREAM_DRAWorGL_DYNAMIC_DRAW吗?

4

2 回答 2

5

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

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

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

于 2010-11-03T21:31:12.740 回答
1

通过正确设置 VBO,您可以使用最佳方式将数据传输到 GPU。通过这样做,您可能会跳过一些驱动程序处理。了解您获得了多少改进的唯一方法是衡量。卡与卡不同。

对于 VBO 操作方法,请参阅: VBO 教程

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

于 2010-11-03T20:43:27.980 回答