C++ 使用VBOs和VAOs是否会提高具有共享内存的集成芯片的性能

C++ 使用VBOs和VAOs是否会提高具有共享内存的集成芯片的性能,c++,opengl-es-2.0,vbo,C++,Opengl Es 2.0,Vbo,在我们当前的项目中,我们正在使用。即使在规范中,也有人告诉我们OGLES2.0是受支持的,我们没有使用VBOs和VAOs(没有glGenBuffers,glBindBuffers),因此我们使用客户端顶点缓冲 我们的想法是,如果我们使用VBOs,我们将有更好的性能。但现在我在想这件事;如果GPU和CPU已经在使用VBOs共享同一内存,则会产生任何差异。因为在我看来,VBOs有帮助,因为我们不需要每次都将数据传输到GPU,但在这种情况下,当内存共享时,我不确定它是否会产生任何影响 我的问题是,对于

在我们当前的项目中,我们正在使用。即使在规范中,也有人告诉我们OGLES2.0是受支持的,我们没有使用VBOs和VAOs(没有glGenBuffers,glBindBuffers),因此我们使用客户端顶点缓冲

我们的想法是,如果我们使用VBOs,我们将有更好的性能。但现在我在想这件事;如果GPU和CPU已经在使用VBOs共享同一内存,则会产生任何差异。因为在我看来,VBOs有帮助,因为我们不需要每次都将数据传输到GPU,但在这种情况下,当内存共享时,我不确定它是否会产生任何影响


我的问题是,对于共享内存的硬件,使用VBOs是否会提高性能?如果集成芯片之间的VBO性能和cpu和gpu分开有区别,它们是什么

在我看来,使用VBOs/VAOs没有缺点,是目前的做法

在VBOs之前,存在普通的旧顶点数组。这意味着您的顶点、顶点属性和索引都在RAM中。当然,这并不能提供最佳性能,因为每次您希望GL绘图时,驱动程序都必须将顶点上载到GPU


也就是说,OpenGL只是一个规范,因此归根结底,它完全取决于驱动程序如何实现这些功能。

对于客户端顶点,驱动程序最多只能分配一些空间并复制顶点,因为它必须考虑到客户端在GPU使用顶点之前修改数据的可能性

在最好的情况下使用VBO,可以跳过该副本,对于从不更改的VBO,可以安全地假设您将获得性能提升(尽管可能只是一个小的提升)


但是,对于不断变化的顶点(如CPU驱动的粒子系统,或为字体/HUD动态生成的四边形),高效使用VBO可能有点棘手。您需要使用某种策略来回收缓冲区(孤立、双缓冲、三缓冲、GL_-MAP_-INVALIDATE_-BUFFER_-BIT),并且您选择的任何选项在某些Android设备子集上的性能都出奇地差。对于不断变化的顶点,客户端顶点可能不是最好的,但至少它们很少是性能黑洞。

这实际上取决于硬件和驱动程序,了解目标平台的唯一方法是测试它。(共享内存体系结构仍然会影响CPU和GPU内存:例如,缓存策略可能会改变)