我有许多粒子,每个帧都会改变顶点。当前正在使用“客户端”内存中的顶点数组绘制顶点。如果我使用顶点缓冲区对象,我可以期待什么性能特征?
由于我必须使用多个glBuffersubData来更新粒子顶点,因此我无论如何都要将每个帧的顶点转移到视频内存(就像我使用常规顶点数组一样)?在这种情况下,VBO有什么好处吗?
这适用于iOS设备。实际的绘制调用:glDrawElements(GL_POINTS,num_particles,GL_UNSIGNED_SHORT,pindices);
我应该使用GL_STREAM_DRAW
还是GL_DYNAMIC_DRAW
?
答案 0 :(得分:5)
Apple's documentation似乎在所有情况下都会推荐VBO。如果您正在使用ES 2.x,则GL_STREAM_DRAW顶点缓冲区类型明确用于“当您的应用程序需要创建呈现少量次数然后丢弃的瞬态几何体时。当您的应用程序必须动态更改顶点时,这非常有用以无法在顶点着色器中执行的方式对每一帧进行数据处理。“然后直接提倡使用glBufferSubData。
逻辑上,我认为完全重新提供数据并将其发送到现有GL_STREAM_DRAW或GL_DYNAMIC_DRAW缓冲区之间的唯一区别在于您的内存映射空间(GPU或CPU,取决于芯片 - MBX实际上并不是这样做VBO,但Apple出于其他性能原因支持它们)可以分配一次而不是分配和释放每一帧。
使用该文档中给出的对齐和打包提示可能比切换到VBO有更好的改进,因为否则CPU只需要在glDrawElements上解压缩和重新打包数据。虽然很可能你已经意识到这一点,但我很欣赏它并不是问题的直接部分 - 我主要将其作为对性能优势的比较猜测。
答案 1 :(得分:1)
通过正确设置VBO,您正在使用将数据传输到GPU的最佳方式。通过这样做,您可以跳过一些驱动程序处理。你能得到多少改进的唯一方法就是衡量。卡与卡不同。
对于VBO操作方法,请参阅:VBO tutorial
修改强> 忘了回答这个问题:是的,这是一个好主意。但首先要衡量。