iOS上针对Retina屏幕的着色器优化

5

我制作了一个使用许多广告牌的3D iPhone应用程序。 在Retina屏幕上,我的帧缓冲区是两倍大,因为我想提高iPhone 4的质量。 问题是由于帧缓冲区大小,片段着色器需要更多时间。 有没有一种方法可以管理Retina屏幕和高清纹理而不增加着色器精度?

1个回答

9
如果您在Retina显示屏上以帧缓冲区的全分辨率进行渲染,则与非Retina显示器相比,每个物理区域将有四倍的像素需要光栅化。如果由于着色器的复杂性而限制了填充速率,则这将导致每个帧花费更长时间进行渲染。
首先,您需要验证您确实受到渲染管线中片段处理部分的限制。运行OpenGL ES Driver工具来查看您的应用程序并查看Tiler和Renderer利用率统计信息。如果Renderer利用率接近100%,则表示您受到片段着色器和推动像素的整体能力的限制。但是,如果您看到Tiler利用率百分比很高,那么这意味着您受到几何限制,并且屏幕分辨率的变化不会像减少顶点数据的复杂性和大小那样影响性能。
假设您受到片段着色器的限制,则有一些事情可以显着提高iOS GPU的性能。
在你的情况下,似乎纹理大小可能是一个问题。我会首先使用PowerVR Texture Compressed(PVRTC)纹理代替标准位图源。 PVRTC纹理以压缩格式存储在内存中,可以比等效位图小得多。这可能通过增加纹理读取的缓存命中来实现更快的访问。
将纹理大小设置为2的幂,并启用mipmaps。我看到mipmaps确实对经常缩小以出现在较小对象上的较大纹理有所帮助。这绝对适用于您的应用程序,该应用程序可能需要支持Retina和非Retina设备。
避免在片段着色器中进行依赖性纹理读取。任何执行计算以确定纹理坐标的内容,或任何落在分支语句内的纹理读取都会触发依赖性纹理读取,这可能比iOS GPU上执行慢一个数量级以上。在正常的纹理读取期间,PowerVR GPU可以预读取一些纹理值,但如果您使用导致依赖性纹理读取,则可能会失去该优化。
我可以谈谈各种优化(在适当的情况下使用lowp或mediump精度等),我已经在这方面得到了一些帮助,但这些似乎是我首先要关注的事情。最后,您还可以尝试通过PowerVR的性能分析编辑器运行着色器,该编辑器可以为这些着色器的最佳和最坏性能提供周期时间估计。
Retina显示设备在片段着色器限制方面甚至都不是最糟糕的罪犯。尝试让iPad 1全屏渲染变得高效,因为它比iPhone 4/4S拥有更多的像素,但GPU比iPad 2/3或iPhone 4S慢得多。如果您能使iPad 1上的某些内容运行良好,则在其他所有设备上(甚至是Retina iPad)都会很好。

感谢您提供的所有详细信息。渲染器利用率约为99%,平铺器利用率约为5%。我认为,由于我的大部分广告牌都像2D精灵一样显示(纹理未经缩放),因此mipmapping不会改善性能。我将尝试使用PowerVR的分析编辑器,并在iPad 1上测试我的应用程序。 - Klem
谢谢Brad。过去6个月我一直在疯狂编写着着色器,当我学会如何修改纹理坐标时,就像是我的大脑里被打开了一盏灯。但是最近我一直在想,从两个不同的纹理中读取还是将基础和法线贴图平铺在单个纹理中,哪种更快。苹果的最佳实践着色器指南暗示,如果在顶点着色器中对texcoord进行修改,则不是依赖纹理读取。我将尝试这样做,看看iPhone4的渲染速度是否加快。也许还可以尝试不同的贴图。 - badweasel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接