【发布时间】:2011-10-27 11:51:07
【问题描述】:
我有一个关于 OpenGL ES 下的渲染性能的简单问题。
假设我在 iPhone 或三星 Galaxy S 等移动设备上渲染一个简单的 2D 粒子系统,假设有 1000 个粒子。
所有粒子都是从相同的纹理渲染的。 粒子在其生命周期中被缩放和旋转。 我们在这里讨论的是 OpenGL ES。
比较实用的方法是什么:
1) 设置一批顶点并将每个粒子转换到其中(使用 CPU 进行所需的转换),然后对 glDrawArrays 进行 1 次调用以一次绘制所有粒子。
2) 使用(伪!)这样的代码绘制每个粒子:
glPushMatrix();
glColor4f(_act_color.r, _act_color.g, _act_color.b, _act_color.a);
glTranslatef(_pos.x, _pos.y, 0.0f);
glRotatef(_rot, 0, 0, 1);
glVertexPointer(2, GL_FLOAT, sizeof(vertexVT), &verBuf[0].v[0]);
glTexCoordPointer(2, GL_FLOAT, sizeof(vertexVT), &verBuf[0].t[0]);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glPopMatrix();
哪种方式更好。选择第一种方式时,它需要更多的 CPU 能力,但它应该在所有设备上表现相同。第一种方式的一个撤回将是我得到一些顶点开销,因为我必须在每个粒子之间使用“退化”顶点。
第二种方式在硬件中进行转换,但所有 Open GL 突击队在不同平台上的行为方式是否相同?
您对每种实施方式有何看法?我想展示每种方式的优缺点。
【问题讨论】:
标签: android ios performance opengl-es