在我们目前的项目中,我们正在使用this intel integrated chip。即使在规范中,它被告知支持OGL ES 2.0,我们也没有使用VBO和VAO(没有glGenBuffers,glBindBuffers),因此我们使用了客户端侧顶点缓冲。
我们提出这样的想法:如果我们使用VBO,我们将获得更好的性能。但现在我在考虑它;如果GPU和CPU已经使用VBO共享相同的内存有任何区别。因为在我看来,VBO有帮助,因为我们不需要每次都将数据传输到GPU,但在这种情况下,当内存共享时我不确定它是否会产生任何影响。
我的问题是我的硬件共享内存,使用VBO会提高性能吗?如果集成芯片之间的VBO性能有差异,并且cpu和gpu分开了它们是什么?
对于客户端顶点,驱动程序最多必须分配一些空间并复制顶点,因为它必须允许客户端在GPU消耗顶点之前修改数据。
对于最好的情况下的VBO,可以跳过该副本,对于永远不会改变它的VBO,可以安全地假设您将获得性能提升(虽然可能是一个小的)。
但是,对于不断变化的顶点(如CPU驱动的粒子系统,或者为字体/ huds动态生成的四边形),使用VBO可能会有点棘手。您需要使用某种策略来回收缓冲区(孤立,双缓冲,三重缓冲,GL_MAP_INVALIDATE_BUFFER_BIT),您选择的任何选项似乎在Android设备的某些子集上表现不佳。对于不断变化的顶点,客户端顶点可能不是最好的,但至少它们很少是性能黑洞。
在我看来,使用VBO / VAO没有缺点,是目前的做法。
https://www.khronos.org/opengl/wiki/Client-Side_Vertex_Arrays
“在VBO之前,有一些普通的旧顶点数组。这意味着你的顶点和顶点属性和索引都在RAM中。当然,这并没有提供最好的性能,因为每次你想要GL绘制,驱动程序必须上传GPU的顶点。“
也就是说,OpenGL只是一个规范,所以在一天结束时,这一切都取决于你的驱动程序如何实现这些。