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

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

如果在Retina显示器的全分辨率下使用帧缓冲器进行渲染,则与非Retina显示器的相同物理区域相比,它将具有四倍的光栅扫描范围。 如果由于着色器的复杂性而导致填充率受到限制,则会导致每个帧花费更长的时间来渲染。

首先,你需要validation你确实受到渲染pipe道的片段处理部分的限制。 针对您的应用程序运行OpenGL ES驱动程序工具,并查看“平铺器和渲染器利用率”统计信息。 如果“渲染器利用率”接近100%,则表示受限于片段着色器以及您推动像素的整体能力。 但是,如果您看到了Tiler Utilization百分比,那么这意味着您的几何尺寸有限,屏幕分辨率的变化不会像降低顶点数据的复杂性和大小那样影响性能。

假设你受限于片段着色器,你可以做一些事情来显着提高iOS GPU的性能。

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

使您的纹理的大小两个权力,并启用mipmap。 我已经看到mipmap真的帮助大的纹理,往往会缩小到出现在较小的对象。 这听起来像你的应用程序,可能需要支持视网膜和非视网膜设备的情况。

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

我可以进行各种优化(在适当的时候使用lowp或者mediump精度而不是highp等等), 在这方面我自己也有一些帮助 ,但是这些似乎是我所关注的第一件事情。 最后,您还可以尝试通过PowerVR的性能分析编辑器运行着色器 ,这可以为您提供循环时间估计,以评估这些着色器的最佳和最差情况性能。

Retina显示设备在片段着色器限制方面甚至不是最差的违规者。 尝试让渲染到iPad 1的全屏显示效果更好,因为它比iPhone 4 / 4S拥有更多的像素,而且比iPad 2/3或iPhone 4S的GPU要慢得多。 如果你能在iPad 1上运行得更好,那么在iPad上的其他任何东西(甚至是视网膜iPad)都可以。