Iphone 正在使用顶点缓冲区对象';对于非常动态的数据,从性能角度来看,这是个好主意吗?

Iphone 正在使用顶点缓冲区对象';对于非常动态的数据,从性能角度来看,这是个好主意吗?,iphone,graphics,opengl-es,vbo,Iphone,Graphics,Opengl Es,Vbo,我有很多粒子,它们的顶点每一帧都会改变。当前正在使用“客户端”内存中的顶点数组绘制顶点。如果使用顶点缓冲区对象,我可以期望什么性能特征 由于我必须使用大量glBuffersubData来更新粒子顶点,因此我将在每一帧都将顶点传输到视频内存,对吗(就像我使用常规顶点数组一样)?在这种情况下,VBO有什么好处吗 这是针对iOS设备的。实际的绘制调用:gldraw元素(GL_点、num_粒子、GL_无符号_短、pindice) 我应该使用GL\u STREAM\u DRAW还是GL\u DYNAMIC

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

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

这是针对iOS设备的。实际的绘制调用:gldraw元素(GL_点、num_粒子、GL_无符号_短、pindice)


我应该使用
GL\u STREAM\u DRAW
还是
GL\u DYNAMIC\u DRAW

通过正确设置VBO,您正在使用将数据传输到GPU的最佳方式。这样做,您可能会跳过一些驱动程序处理。衡量你的进步程度的唯一方法就是衡量。这是不同的卡到卡

有关VBO操作方法,请参见以下内容:

编辑 忘了回答问题:是的,这是个好主意。但第一个衡量标准似乎是在所有情况下都推荐VBO。如果您使用的是ES 2.x,则GL_STREAM_DRAW顶点缓冲区类型明确适用于“当您的应用程序需要创建经过少量渲染然后丢弃的瞬态几何体时。当您的应用程序必须以顶点着色器无法执行的方式动态更改每一帧的顶点数据时,这非常有用。”然后直接提倡使用glBufferSubData

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


使用该文档中给出的对齐和打包技巧可能比切换到VBOs提供更好的改进,因为否则CPU只需在元素上解包和重新打包数据。虽然您可能已经意识到了这一点,我也明白这并不是问题的直接部分——我主要是把它作为性能优势的一个比较猜测来提出的。

我不认为VBO总是最佳的,因为大量的BufferSubdata或更糟糕的mapBuffer会造成开销(因为它必须将缓冲区复制回客户端)可能比顶点阵列的开销更糟糕。的确,它确实值得每一张显卡进行一次彻底的测试,以确定,我只是想看看我是否可以从人群的知识中吸取教训……因为在我的情况下,在这一点上不值得进行测试。CPU必须做的事情取决于图形芯片和驱动程序数据类型与性能无关。数据类型与性能无关,而驱动程序负责重新打包。关键是要使用图形芯片中intern数据类型的类型,然后驱动程序与性能无关。相反,苹果的文档(如我的回答中所链接的)明确指出“未对齐的数据需要更多的处理,尤其是当应用程序使用顶点缓冲区时。"请看最后一句话。假设您是ADC成员,另请看例如,这是一位苹果员工再次解释对齐的速度优势。内存控制器通常通过读取两个相邻值并组合结果来读取未对齐的值-因此一次读取需要两次内存回迁,而不是一次。好的,我不知道iphone,我不知道这个问题是为了这个。我的答案是opengl(用于PC)的通用哦,是的,完全同意。对齐是一个因素,只是因为苹果已经足够好地记录了驱动程序和硬件细节,超出了GL规范。希望我没有听起来粗鲁。不幸的是,我使用的是ES 1.1,所以我不能使用STREAM_DRAW。我仍然不相信VBO更快,因为我必须为每一个做一个子缓冲区粒子索引(如果我对数组有创意的话,可能会少一些)。或者是一个大的子缓冲区。没有VBO,它只会为“活动粒子”分配/复制(基于我发送的索引数量)当然,这是一个非常具体的优化案例,如果它成为瓶颈,我会做一些测试。不过,感谢您从苹果找到官方消息。