加载顶点的优化:VAO & VBO & Map Buffer - MartinRGB/GLES30_ProgrammingGuide_NDK GitHub Wiki
加载顶点属性的几种方法以及优化
Vertex Array
在使用 Vertex Array 方法(具体为在使用glVertexAttribPointer
)加载顶点属性时,要注意结构数组和数组结构的区别
结构数组
- 在一个缓冲区中存储所有顶点属性
数组结构
- 在多个缓冲区中分别单独存储顶点属性
一般来说,在结构数组中,顶点顺序按顺序读取,达到更高效的内存访问模式,可以参考这篇文章
VBO:
一般结合 Vertex Array
顶点缓冲对象VBO是在显卡存储空间中开辟出的一块内存缓存区,用于存储顶点的各类属性信息,如顶点坐标,顶点法向量,顶点颜色数据等。在渲染时,可以直接从VBO中取出顶点的各类属性数据,由于VBO在显存而不是在内存中,不需要从CPU传输数据,处理效率更高。
VAO:
一般结合VBO
VAO,是这样一种方式:把对象信息直接存储在图形卡中,而不是在当我们需要的时候传输到图形卡。这就意味着我们的应用程序不用将数据传输到图形卡或者是从图形卡输出,这样也就获得了 额外的性能提升。
VBO保存了一个模型的顶点属性信息,每次绘制模型之前需要绑定顶点的所有信息,当数据量很大时,重复这样的动作变得非常麻烦。VAO可以把这些所有的配置都存储在一个对象中,每次绘制模型时,只需要绑定这个VAO对象就可以了。
使用VAO并不难。我们不需要大量的glVertex调用,而是把顶点数据存储在数组中,然后放进VBO,最后在VAO中存储相关的状态。记住:VAO中并没有存储顶点的相关属性数据。OpenGL会在后台为我们完成其他的功能。
Map Buffer:
一般结合VBO
临时映射缓冲,将缓冲区对象存储映射到应用程序的地址空间,相较于glBufferData
,优点:
- 减少 App 内存占用
- 映射缓冲区返回的是 GPU 存储缓冲区地址空间的直接指针,避免了重复步骤,实现更好的更新性能