在iPhone上限制FPS速率?

4

我该如何在使用CADisplayLink的OpenGL应用程序中限制FPS速率,以便我可以将CPU留给其他任务?

3个回答

6
尽管这个问题已经得到了回答,但我想进一步扩展一下。
推荐的方法确实是使用CADisplayLink和frameInterval来限制基础帧率,硬件显示本身具有固定的刷新率,并且CADisplayLink方法将硬件刷新与调用我们的绘图方法同步,因此绘图方法有最多的时间来工作。
由于CADisplayLink是硬件生成的,您可以做的唯一事情就是分配时间,这就是frameInterval的作用。
frameInterval = 1 可以获得60 fps
frameInterval = 2 可以获得30 fps
frameInterval = 3 可以获得20 fps
例如,我在菜单中经常使用frameInterval = 5,它仍然给我12fps(大约是合理简单动画的最小值),而电池消耗也大大降低。
我还使用了动态帧率更改,通过测量平均帧率并选择低于该帧率的frameInterval,有助于保持游戏流畅。
这些值之外的FPS不太稳定,通常会导致抖动的动画,我们要处理的时间片是1/60秒,因此只有那些倍数才能产生流畅的动画。即使您不使用CADisplayLink并制作一个完美的时间路由以提供其他内容,硬件仍将以该时间片进行绘制。

4

我并没有从函数中得到“限制我的FPS率”这个术语,但为了使您的OpenGL应用程序平稳运行,在iOS 5中,它应该有高达60的FPS(每秒帧数),而且您应该维持(我认为在您的情况下是限制)这个FPS以获得更好的性能。

Xcode提供了许多工具来帮助您分析和调整您的OpenGL ES应用程序,如iOS的OpenGL ES编程指南中所述:

OpenGL ES性能检测工具 — 在Xcode 4中首次引入的OpenGL ES性能检测工具可以帮助您快速确定OpenGL ES是否是应用程序的主要瓶颈。这应该是测试OpenGL ES代码时运行的第一个工具。 OpenGL ES性能检测工具的一个关键优点是它可以自动定位导致OpenGL ES性能最慢的关键位置,以便您立即查看。要使用OpenGL ES性能检测工具,请启动该工具并使用它在连接到开发机器的基于iOS的设备上选择您的应用程序。当您的应用程序到达您感兴趣的位置时,单击“收集证据”按钮。 OpenGL ES性能检测工具记录应用程序生成的OpenGL ES命令,分析这些命令以发现关键瓶颈,并提供特定的性能建议。 OpenGL ES性能检测工具位于/Developer/Applications/Graphics Tools/目录中。
Instruments(OpenGL ES分析) — 也是在Xcode 4中引入的,OpenGL ES分析工具提供了多种功能,帮助您研究应用程序对OpenGL ES的使用。 OpenGL ES分析工具记录应用程序生成的OpenGL ES命令,并在应用程序未遵循本编程指南中描述的最佳实践时向您发出警告; 它还建议您采取特定的更改以遵循最佳实践。 OpenGL ES分析工具允许您查看用于生成每个动画帧的所有命令。 最后,OpenGL ES分析工具使您可以选择性地禁用图形管道的某些部分,以确定该管道的哪一部分是应用程序的重要瓶颈。 OpenGL ES分析工具为您提供了一整套手动分析应用程序并了解其内部运作方式的工具。 但它不会自动指出当前应用程序瓶颈所在的位置。例如,即使它建议您改进OpenGL ES编码实践,该建议也不意味着更改代码会自动改善应用程序的性能。
Instruments(OpenGL ES驱动程序) — OpenGL ES驱动程序工具可用于Xcode 3及更高版本。 它不直接分析应用程序提交的OpenGL ES命令。 相反,它允许您监视有关应用程序如何利用图形硬件的关键统计信息。 例如,您可以使用它来跟踪用于保存纹理数据的字节数,以及这些数字从帧到帧如何变化。

该应用程序大量使用像素着色器。在3gs上无法达到60 fps是不可能的。我知道它不会很流畅。 - user642252
在3GS(使用iOS4)上,为了获得更好的性能,建议将帧率设置为30帧/秒。虽然你使用了大量图形,但你可以使用工具来指导你找出哪个渲染引起了FPS下降。我曾看到有人使用工具来找到FPS下降的确切问题。那些工具会引导他们找到问题所在的确切代码。 - Ajeet Pratap Maurya

4
一般情况下,如果您使用苹果推荐的CADisplayLink方法来绘制应用程序,则无法真正控制刷新率。但是,您可以将frameInterval属性设置为大于1的值以跳过绘制帧,从而降低帧率。例如,frameInterval = 2应该会给您大约30 fps而不是60 fps。
与其削减帧率,将一些应用程序工作放在另一个线程上或优化绘图任务可能更有用。

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