首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化iPhone OpenGL ES填充率

优化iPhone OpenGL ES填充率
EN

Stack Overflow用户
提问于 2010-05-07 01:35:26
回答 7查看 15.3K关注 0票数 12

我在iPhone上有一个开放的GL游戏。我的框架很烂,~20 framerate。使用Xcode OpenGL ES性能工具在iPhone 3G上显示:

渲染器利用率: 95%至99%

拖网利用率:~27%

我画了很多相当大的图像与大量的混合。如果我减少绘制的图像数量,框架将从20到40,尽管性能工具的结果保持不变(渲染器仍然最高)。我认为我受到iPhone 3G的填充率的限制,但我不确定。

我的问题是:如何以更高的粒度确定瓶颈所在?这是我最大的问题,我只是不知道什么一直在消耗。如果是填充物,除了画得少外,我还能做些什么来改进它吗?

我用的是纹理地图集。我试图最小化图像绑定,尽管它并不总是可能的(绘制顺序,不是所有的东西都适合一个1024x1024纹理,等等)。每帧我做10个图像绑定。这似乎很合理,但我可能弄错了。

我使用顶点数组和glDrawArrays。我真的没有很多几何学。如果需要的话,我可以试着更精确。每个图像是两个三角形,我试着对事情进行分批处理是可能的,尽管通常(可能有一半的时间)图像是用单独的glDrawArrays调用绘制的。除了图像,我有~60三角形的几何学正在渲染在~6 glDrawArrays调用。我经常在打电话给glTranslate之前先打电话给glDrawArrays。

切换到VBO会改善框架吗?我不认为它是一个巨大的几何量,但也许它是更快的其他原因?

是否有某些事情值得注意,这可能会降低性能?我应该避免glTranslate,glColor4g等吗?

我在每帧3位中使用glScissor。每次使用都包含两个glScissor调用,一个用来设置它,另一个用来将它重置为原来的样子。我不知道这里是否有很大的性能影响。

如果我使用PVRTC,它能更快地渲染吗?目前,我所有的图像都是GL_RGBA。我没有记忆问题。

我的全屏纹理之一是256x256。使用480x320是否更好,这样手机就不必进行任何缩放了?对于纹理大小,还有其他一般的性能建议吗?

以下是我所画的东西的大致思路,按以下顺序排列:

1)转换为透视矩阵。2)绘制全屏背景图像3)绘制半透明的全屏图像(该图像具有滚动纹理)。4)画几个精灵。5)转换为正交矩阵。6)画几个精灵。7)转换为透视矩阵。( 8)绘制精灵和其他纹理几何。9)转换为正交矩阵。10)画几个精灵(如游戏HUD)。

步骤1-6画了一堆背景资料。8绘制游戏的大部分内容。10绘制HUD。

正如您所看到的,有许多层,其中一些是全屏的,有些是非常大的(屏幕的1/4)。这些图层使用半透明,所以我必须把它们画成从后到前的顺序。这是进一步复杂的,因为需要绘制各种层次的矫形和其他的角度。

如有需要,我乐意提供更多资料。谢谢您对我的问题提出的任何性能建议或一般性建议!

编辑:

我添加了一些日志记录,以查看我正在执行多少glDrawArrays调用,以及使用了多少数据。我每帧打大约20个glDrawArray电话。通常情况下,其中大约1到6个点有大约40个顶点。其余的调用通常只有两个顶点(一个图像)。我只是在使用glVertexPointer和glTexCoordPointer。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-05-08 03:33:31

鉴于渲染器的利用率基本上是100%,这表明瓶颈是填充、纹理和混合像素。旨在优化顶点处理(VBO和顶点格式)或CPU使用(绘制调用批处理)的技术可能没有帮助,因为它们不会加快像素处理。

您最好的选择是减少正在填充的像素数,并查看不同的纹理格式,以便更好地利用第一代设备上可用的非常有限的内存带宽。尽可能使用PVRTC纹理,否则使用16位未压缩纹理。

票数 7
EN

Stack Overflow用户

发布于 2010-05-07 13:00:05

看看苹果的"使用纹理数据的最佳实践“和"使用顶点数据的最佳实践”部分的OpenGL ES iPhone操作系统编程指南。他们强烈建议(和其他人一样)使用PVRTC压缩纹理,因为它们可以提供比标准未压缩纹理8:1或16:1的压缩比。除了mipmapping之外,您似乎正在进行其他建议的优化,即使用纹理地图集。

您似乎没有几何学限制,因为(正如我在这个问题中所发现的),Tiler统计数据似乎表明几何图形大小造成了多少瓶颈。然而,iPhone 3G S(以及第三代iPod touch和iPad)支持硬件加速的VBO,所以您可以尝试一下,看看它们如何影响性能。它们可能没有压缩纹理的效果那么大,但它们并不难实现。

票数 3
EN

Stack Overflow用户

发布于 2010-11-12 11:41:54

一个大的胜利(主要是为)3G也将是纹理过滤你正在使用。检查是否使用“三线性”过滤,并将其更改为"BILINEAR“。

请确保设置如下纹理:

代码语言:javascript
复制
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

不是这样的:

代码语言:javascript
复制
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

哈里

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2785640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档