【问题标题】:OpenGL ES render performanceOpenGL ES 渲染性能
【发布时间】: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


【解决方案1】:

哪种方式更好。

两者都没有。 OpenGL 矩阵操作也发生在 CPU 上。每一个矩阵-矩阵乘法——这就是 glRotate、glTranslate、glScale 所做的——需要 64 次乘法和 16 次加法,同样消耗 CPU 周期。

你真正应该做的是实例化。详细解释见这篇文章:http://nukecode.blogspot.com/2011/07/geometry-instancig-for-iphone-wip.html

【讨论】:

  • 感谢您的链接。我会仔细看看的。不幸的是,我现在坚持使用 OpenGL ES 1.1。但这可能很快就会改变。
【解决方案2】:

实际上,第一种方法会更快,因为对每个单独的四边形进行单独的绘制调用非常昂贵。这也意味着您不必为每个四边形向 GPU 发送一个新矩阵,这样可以节省时间。并且结合平移和旋转矩阵不需要完整的 4x4 矩阵乘法,您可以在那里采取一些捷径。

如果您打算这样做,只需创建一个 VBO(使用 GL_DYNAMIC_DRAW,因为数据会在每一帧中更改),您可以将计算的顶点数据复制到其中。如果你可以在没有旋转的情况下生活,你可以研究点精灵来做粒子。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
相关资源
最近更新 更多