我最近将我的iPad2从5.x更新到iOS 6.0.1并将xcode升级到4.5.2。现在,当我构建并运行我的游戏时,它以60 fps的速度运行。然而,当3d模型接近屏幕时,帧速率现在降至40fps并且即使模型离开屏幕也会停留在那里。有没有办法克服这个问题,还是iOS 6.0.1或xcode 4.5.2的错误?这可能是iOS 6.0.1的某种省电功能吗? 任何帮助将不胜感激。
答案 0 :(得分:0)
据我所知,iOS 6.0.1或Xcode 4.5.2中没有可能导致这种情况的错误,但我只是一名工作的iOS开发人员,而不是负责这些项目质量控制的工程师。
使用此问题中提供的最少信息,我的第一个猜测是模型是使用mipmapped纹理绘制的。当远离相机时,使用较小版本的纹理,但当它靠近相机移动时,使用更大版本的纹理。您可以做的一件事就是关闭此模型的纹理并检查性能。然而,我假设你正在使用纹理,所以这个建议可能会偏离基础。
诊断此问题的最佳方法是使用Xcode 4.5中提供的最新OpenGL调试和分析工具。我建议在OpenGL上观看去年夏天的WWDC会议视频,了解如何使用这些工具。
编辑以评论您发布的着色器:
着色器可以并行处理片段,但如果着色器中的条件评估为片段间的不同值,则会减少并行进程的数量。引用 OpenGL ES 2.0编程指南的第156页:
GPU通常执行具有多个顶点或a的顶点着色器 片段着色器并行多个片段。的数量 并行执行的顶点或片段将取决于 GPU的性能目标。 if和if-else中的bool_expression 条件语句可以具有不同的顶点值或 片段并行执行。这会影响性能 GPU并行执行的顶点或片段的数量是 降低。我们建议为了获得最佳性能,请有条件 语句应与bool_expression值一起使用 对于并行执行的顶点或片段也是如此。这将 如果使用统一表达式就是这种情况。
也许GPU很乐意处理大量片段,因为每个片段的布尔值都相同。然后GPU获取布尔不再评估相同的片段,并且它不再并行处理片段。知道这些可以评估到不同的值,即使模型从相机进一步移动,GPU仍继续以较少的并行性处理片段。
您的一系列if语句将值限制为特定状态。也许编写一个可以给出类似结果的方程式可以解决这个问题。尝试类似:
df = (floor(mod((((df + 0.2) * 10.0) / 3.0), 4.0)) * 3.0) / 10.0;
我实际上并没有使用此代码编译着色器,也没有完全匹配您的范围,因此您可能需要进行一些调整。但这应该保持并行性。
答案 1 :(得分:0)
似乎"问题"在iOS 7上修复了。
我遇到了完全相同的问题......今天早上安装了新操作系统,似乎帧速率问题已经消失了。
现在帧速率下降是一致的。如果你做了太多GPU的东西,它仍然会下降......但是随着GPU执行的操作越来越少,它会逐渐回落到60.
所以最终它似乎是某种"驱动程序/操作系统问题" (虽然没有官方确认)