我在学习OpenGL ES的过程中略微修改了iPhone SDK的GLSprite示例,但结果却很慢.即使在模拟器中(最糟糕的是),所以我必须做错事,因为它只有400个纹理三角形.
const GLfloat spriteVertices[] = {
0.0f, 0.0f,
100.0f, 0.0f,
0.0f, 100.0f,
100.0f, 100.0f
};
const GLshort spriteTexcoords[] = {
0,0,
1,0,
0,1,
1,1
};
- (void)setupView {
glViewport(0, 0, backingWidth, backingHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(0.0f, backingWidth, backingHeight,0.0f, -10.0f, 10.0f);
glMatrixMode(GL_MODELVIEW);
glClearColor(0.3f, 0.0f, 0.0f, 1.0f);
glVertexPointer(2, GL_FLOAT, 0, spriteVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(2, GL_SHORT, 0, spriteTexcoords);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
// sprite data is preloaded. 512x512 rgba8888
glGenTextures(1, &spriteTexture);
glBindTexture(GL_TEXTURE_2D, spriteTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);
free(spriteData);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glEnable(GL_TEXTURE_2D);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
}
- (void)drawView {
..
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glTranslatef(tx-100, ty-100,10);
for (int i=0; i<200; i++) {
glTranslatef(1, 1, 0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
..
}
Run Code Online (Sandbox Code Playgroud)
每次触摸屏幕或移动屏幕上的手指并将tx,ty设置为触摸发生的x,y坐标时,都会调用drawView.
我也试过使用GLBuffer,当预先生成翻译并且只有一个DrawArray但是给出了相同的性能(~4 FPS).
===编辑===
与此同时,我对此进行了修改,以便使用更小的四边形(尺寸:34x20),并且完成的重叠要少得多.整个屏幕上有~400个四边形 - > 800个三角形.纹理大小为512x512 atlas和RGBA_8888,而纹理坐标为float.代码在API效率方面非常难看:有两个MatrixMode更改以及两个加载和两个转换然后是三角形条带(quad)的drawarrays.现在这产生~45 FPS.
小智 19
(我知道这已经很晚了,但我无法抗拒.无论如何,我会发帖,以防其他人来这里寻求建议.)
这与纹理大小无关.我不知道为什么人们评价尼尔斯.他似乎对OpenGL管道存在根本性的误解.他似乎认为对于给定的三角形,整个纹理被加载并映射到该三角形上.反之亦然.
将三角形映射到视口后,将对其进行栅格化.对于三角形覆盖的每个屏幕上像素,将调用片段着色器.默认的片段着色器(您正在使用的OpenGL ES 1.1)将查找最接近地映射((GL_NEAREST)的纹素到您正在绘制的像素.它可能会查找4个纹素,因为您使用更高质量的GL_LINEAR方法来平均最佳纹素.尽管如此,如果你的三角形中的像素数是100,那么你必须读取的最多纹理字节是4(查找)*100(像素)*4(每种颜色的字节.远远小于Nils所说的.令人惊讶的是,他能让听起来像他真正知道他在说什么.
WRT平铺架构,这在嵌入式OpenGL设备中很常见,以保留引用的局部性.我相信每个瓷砖都会暴露在每个绘图操作中,很快就会剔除它们中的大部分.然后瓷砖决定在自己上绘制什么.当你打开混合时,这会慢得多.因为您使用的是可能重叠并与其他图块混合的大三角形,所以GPU必须做很多额外的工作.如果不是渲染具有alpha边缘的示例正方形,而是渲染实际形状(而不是形状的方形图片),那么你可以关闭场景的这一部分的混合,我打赌这会加快速度极大.
如果你想尝试它,只需关闭混合,看看有多少东西加速,即使看起来不对.glDisable(GL_BLEND);
| 归档时间: |
|
| 查看次数: |
8480 次 |
| 最近记录: |