Graphics OpenGL ES 2.0:静态和动态顶点数据的高效渲染

Graphics OpenGL ES 2.0:静态和动态顶点数据的高效渲染,graphics,opengl-es,vbo,vertex-array,Graphics,Opengl Es,Vbo,Vertex Array,我正在编写一个iOS/Android游戏,并寻找使用OpenGL ES 2.0渲染顶点数据的最有效的方法。我有两种不同类型的数据:每帧更改属性的动态数据,例如播放器或动画背景对象,以及静态数据,例如静态背景或地形。从昨天开始,我在谷歌上搜索了很多,但我找不到一个明确而独特的答案,即最好的方法是呈现这些数据 呈现此类数据基本上有三个选项(如果我没有遗漏一个,请随意更正): 仅限顶点数组: 只需在CPU上的每一帧填充顶点(包括动态数据) 仅限顶点缓冲区对象: 使用GL_DYNAMIC_DRAW在GP

我正在编写一个iOS/Android游戏,并寻找使用OpenGL ES 2.0渲染顶点数据的最有效的方法。我有两种不同类型的数据:每帧更改属性的动态数据,例如播放器或动画背景对象,以及静态数据,例如静态背景或地形。从昨天开始,我在谷歌上搜索了很多,但我找不到一个明确而独特的答案,即最好的方法是呈现这些数据

呈现此类数据基本上有三个选项(如果我没有遗漏一个,请随意更正):

仅限顶点数组: 只需在CPU上的每一帧填充顶点(包括动态数据)

仅限顶点缓冲区对象: 使用GL_DYNAMIC_DRAW在GPU上分配一个VBO,其中存储动态和静态数据。然后,动态数据通过glBufferSubData每帧更新一次

同时使用: 静态数据使用VBO存储和渲染,动态数据使用顶点数组渲染。使用此选项,我们需要两个渲染过程,一个用于渲染VBO,另一个用于渲染顶点阵列


由于第一个选项没有利用静态数据的不变性,而第三个选项需要两个渲染过程,所以我猜我应该使用第二个选项。但是,我绝对不能确定这一点,我希望您能澄清我的困惑。

分配两个顶点缓冲区对象。带有提示
GL\u DYNAMIC\u DRAW
且将频繁更新的一个。为不可变数据分配第二个VBO,并使用提示
GL\u STATIC\u DRAW
,GL_静态_绘图应用于“将修改一次并多次使用”的数据;正是你需要的

这里提到两个渲染过程可能是对术语的误用:您要做的是在两个单独的绘图命令中渲染场景。由于绘图命令是异步运行的,因此您不应体验到这样做会影响性能。
另一方面,第二个渲染过程是使用不同的设置渲染整个场景两次(),或者对先前渲染过程的输出执行某些图像处理效果。

AFAIK手机中的主内存和视频内存在物理上是相同的。我以前只使用过android,但我看不到顶点数组(动态)和VBO(缓冲/更静态)速度的区别。图形可能非常复杂,在许多情况下是不直观的,因此花额外的时间编写一些简单的测试是值得的。如果可以,请让GPU制作动画并更改数据:)