我正在编写一个iOS/Android游戏,并正在寻找使用OpenGL ES 2.0渲染顶点数据的最高性能方式。我有两种不同类型的数据:每帧更改其属性的动态数据,例如播放器或动画背景对象,以及静态数据,例如静态背景或地形。从昨天开始,我用谷歌搜索了很多,但我找不到一个明确而独特的答案来回答什么是最好的问题是渲染这些数据。
渲染此类数据基本上有三个选项(如果我不错过一个。如果是这样,请随时纠正我。
仅顶点数组:只需填充 CPU 上的每一帧(包括动态数据)的顶点即可。
仅限顶点缓冲区对象:在 GPU 上分配一个 VBO,其中存储了动态和静态数据GL_DYNAMIC_DRAW。然后,动态数据通过glBufferSubData每帧更新一次。
同时使用:静态数据使用 VBO 存储和呈现,动态数据使用 顶点数组呈现。使用此选项,我们需要两个渲染通道,一个用于渲染 VBO,另一个用于渲染顶点数组。
由于第一个选项没有利用静态数据的不变性,并且由于第三个选项需要两次渲染传递,因此我的猜测是我应该使用第二个选项。但是,我绝对不确定这一点,希望您能澄清我的困惑。
分配两个顶点缓冲区对象。一个带有提示GL_DYNAMIC_DRAW
,将经常更新。为不可变数据分配第二个 VBO,并使用提示GL_STATIC_DRAW
。根据 API 文档,GL_STATIC_DRAW 应该用于"将修改一次并多次使用"的数据;正是您需要的。
在这里说到两个渲染通道可能是对该术语的误用:您要做的是在两个单独的绘图命令中渲染场景。由于绘制命令是异步运行的,因此不应因此而对性能造成任何影响。另一方面,第二个渲染通道是使用不同的设置渲染整个场景两次(请参阅此处的示例),或者对先前渲染通道的输出执行一些图像处理效果。