iOS上视网膜屏幕的着色器优化

时间:2012-03-30 16:05:37

标签: objective-c ios opengl-es-2.0 shader

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

1 个答案:

答案 0 :(得分:9)

如果您使用Retina显示屏的全分辨率使用帧缓冲区进行渲染,则与非Retina显示屏的相同物理区域相比,光栅的像素数将是光栅的四倍。如果由于着色器的复杂性而导致填充率受限,则会导致每个帧花费更长的时间来渲染。

首先,您需要验证您确实受到渲染管道的片段处理部分的限制。针对您的应用程序运行OpenGL ES Driver工具,并查看Tiler和Renderer Utilization统计信息。如果渲染器利用率接近100%,则表示您受片段着色器和推动像素的整体能力的限制。但是,如果您在此处看到Tiler利用率百分比,则表示您的几何受限,并且屏幕分辨率的变化不会影响性能,只会降低顶点数据的复杂性和大小。

假设您受到片段着色器的限制,您可以采取一些措施来显着提高iOS GPU的性能。

在您的情况下,听起来像纹理大小可能是一个问题。我要做的第一件事是使用PowerVR纹理压缩(PVRTC)纹理而不是标准位图源。 PVRTC纹理以压缩格式存储在内存中,并且可以比等效位图小得多。这可以通过增加纹理读取的缓存命中来实现更快的访问。

使纹理的大小为2,并启用mipmap。我已经看到mipmaps真的有助于更大的纹理,通常会缩小以显示在较小的对象上。对于您的应用来说,这听起来很像是可能需要支持Retina和非Retina设备。

避免像瘟疫这样的片段着色器中的依赖纹理读取。执行计算以确定纹理坐标或任何属于分支语句的纹理读取的任何操作都会触发依赖纹理读取,这可能比在iOS GPU上执行的速度慢一个数量级。在正常纹理读取期间,PowerVR GPU可以在纹理值之前进行一些读取,但是如果使用导致依赖纹理读取,则可能会丢失该优化。

我可以继续进行各种优化(在适当情况下使用lowp或mediump精度而不是highp等),我had a little help in this area myself,但这些似乎是我关注的第一件事。最后,您还可以尝试通过PowerVR's profiling editor运行着色器,这可以为您提供这些着色器的最佳和最差情况下的周期时间估算。

在片段着色器限制方面,Retina显示设备甚至不是最严重的违规者。尝试将一些渲染到iPad 1的全屏幕上进行渲染,因为它的像素比iPhone 4 / 4S更多,但GPU比iPad 2/3或iPhone 4S慢得多。如果你能在iPad 1上获得良好的运行效果,那么其他所有东西都会很好(甚至是Retina iPad)。