繁体   English   中英

OpenGL ES渲染性能

[英]OpenGL ES render performance

我有一个关于OpenGL ES下渲染性能的简单问题。

假设我正在像iPhone或Samsung Galaxy S这样的移动设备上渲染一个简单的2D粒子系统,比如说1000个粒子。

所有粒子均从相同的纹理渲染。 粒子在其生命周期中会缩放并旋转。 我们在这里谈论OpenGL ES。

什么是更可行的方法:

1)设置一批顶点并将每个粒子转换到其中(使用CPU进行所需的转换),然后对glDrawArrays进行1次单一调用以一次绘制所有粒子。

2)使用(pseudo!)代码绘制每个单个粒子,如下所示:

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能力,但在所有设备上的行为都应相同。 第一种方法的撤消方法是获得一些顶点开销,因为我必须在每个粒子之间使用“退化”顶点。

在HW中进行转换的第二种方法,但是所有Open GL突击队在不同平台上的行为都相同吗?

您对每个实施方案有何看法? 我想展示每种方式的利弊。

哪种方法更好。

都不行 OpenGL矩阵处理也发生在CPU上。 每个矩阵矩阵乘法(glRotate,glTranslate,glScale所做的工作)都需要64次乘法和16次加法,从而以相同的方式消耗CPU周期。

您实际上应该做的是实例化 请参阅本文以获取详细说明: http : //nukecode.blogspot.com/2011/07/geometry-instancig-for-iphone-wip.html

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

如果要这样做,只需创建一个VBO(使用GL_DYNAMIC_DRAW,因为数据会在每帧中更改),就可以将计算出的顶点数据复制到其中。 而且,如果您可以不旋转就生活,那么可以研究用于制作粒子的点精灵。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM