【发布时间】:2012-03-30 16:05:36
【问题描述】:
我制作了一个使用许多广告牌的 3D iphone 应用程序。 我的帧缓冲区在视网膜屏幕上大了一倍,因为我想在 iPhone 4 上提高它们的质量。 问题是由于帧缓冲区的大小,片段着色器会消耗更多的时间。 有没有办法在不提高着色器精度的情况下管理视网膜屏幕和高清纹理?
【问题讨论】:
标签: objective-c ios opengl-es-2.0 shader
我制作了一个使用许多广告牌的 3D iphone 应用程序。 我的帧缓冲区在视网膜屏幕上大了一倍,因为我想在 iPhone 4 上提高它们的质量。 问题是由于帧缓冲区的大小,片段着色器会消耗更多的时间。 有没有办法在不提高着色器精度的情况下管理视网膜屏幕和高清纹理?
【问题讨论】:
标签: objective-c ios opengl-es-2.0 shader
如果您在 Retina 显示器的全分辨率下使用帧缓冲区进行渲染,则与非 Retina 显示器的相同物理区域相比,它需要光栅化的像素数量是其四倍。如果由于着色器的复杂性而限制了填充率,这将导致每一帧的渲染时间更长。
首先,您需要确认您确实受到渲染管道的片段处理部分的限制。针对您的应用程序运行 OpenGL ES Driver 工具并查看 Tiler 和 Renderer Utilization 统计信息。如果渲染器利用率接近 100%,则表明您受到片段着色器和推动像素的整体能力的限制。但是,如果您看到您的 Tiler Utilization 百分比在那里,这意味着您受到几何限制,并且屏幕分辨率的变化不会像降低顶点数据的复杂性和大小那样影响性能。
假设您受到片段着色器的限制,您可以采取一些措施来显着提高 iOS GPU 的性能。
在您的情况下,听起来纹理大小可能是个问题。我要做的第一件事是使用 PowerVR 纹理压缩 (PVRTC) 纹理而不是标准位图源。 PVRTC 纹理以压缩格式存储在内存中,并且可以比等效的位图小得多。这可能会通过增加纹理读取的缓存命中率来加快访问速度。
使您的纹理大小为 2 的幂,并启用 mipmap。我已经看到 mipmap 确实有助于较大的纹理,这些纹理通常会缩小以出现在较小的对象上。对于可能需要支持 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)上都会很好。
【讨论】: