4

如何限制我的 OpenGL 应用程序(我正在使用 CADisplayLink)上的 FPS 速率,以便我可以将 CPU 留给其他事情?

4

3 回答 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 并制作完美的时序路由来交付其他内容,硬件仍会使用该时间片进行绘制。

于 2011-12-28T12:11:22.887 回答
4

我没有从函数中得到“限制我的 FPS 速率”这个词。但是为了让您的 openGL 应用程序运行顺畅,它的 FPS 应该高达 60(在 iOS 5 中),并且您应该保持(我认为在您的情况下限制)该 FPS 以获得更好的性能。

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

OpenGL ES 性能侦探— OpenGL ES Performance Detective 首次在 Xcode 4 中引入,可快速帮助您确定 OpenGL ES 是否是应用程序的主要瓶颈;它应该是您运行以测试 OpenGL ES 代码的第一个工具。OpenGL ES Performance Detective 的一个关键优势是它可以自动将您立即引导到应用程序中最会降低 OpenGL ES 性能的关键位置。要使用 OpenGL ES Performance Detective,请启动该工具并使用它在连接到您的开发机器的基于 iOS 的设备上选择您的应用程序。当您的应用程序到达您感兴趣的应用程序位置时,单击收集证据按钮。OpenGL ES Performance Detective 记录您的应用程序在一系列帧上生成的 OpenGL ES 命令,分析命令以发现关键瓶颈并提供具体的性能建议。可以在 /Developer/Applications/Graphics Tools/ 目录中找到 OpenGL ES Performance Detective。

仪器(OpenGL ES 分析)— 同样在 Xcode 4 中引入,OpenGL ES 分析工具提供了许多功能来帮助您研究应用程序对 OpenGL ES 的使用。OpenGL ES 分析工具记录您的应用程序生成的 OpenGL ES 命令,并在您的应用程序未遵循本编程指南中描述的最佳实践时向您发出警告;它建议您可以进行特定更改以遵循最佳实践。OpenGL ES 分析工具允许您查看用于生成每一帧动画的所有命令。最后,OpenGL ES 分析工具允许您有选择地禁用图形管道的某些部分,以确定该部分管道是否是您的应用程序中的一个重要瓶颈。OpenGL ES 分析工具为您提供了一组出色的工具来手动分析您的应用程序并了解其内部工作原理。但是,它不会自动将您指向您的应用程序当前遇到瓶颈的位置。例如,即使它提供了关于如何改进 OpenGL ES 编码实践的建议,该建议并不意味着更改代码会自动提高应用程序的性能。

Instruments (OpenGL ES Driver) — Xcode 3 及更高版本提供了 OpenGL ES Driver 工具。它不会直接分析您的应用程序提交的 OpenGL ES 命令。相反,它允许您监视有关应用程序如何使用图形硬件的关键统计信息。例如,您可以使用它来跟踪用于保存纹理数据的字节数以及这些数字在帧之间的变化情况。

于 2011-12-27T12:22:51.797 回答
4

一般来说,如果您使用 Apple 推荐的CADisplayLink方法来绘制您的应用程序,那么您并不能真正控制刷新率。但是,您可以将 frameInterval 属性设置为大于 1 的值以跳过绘图帧,从而降低帧速率。例如,frameInterval = 2 应该给你大约 30 fps 而不是 60 fps。

将一些应用程序工作放在另一个线程上或优化绘图任务可能比降低帧速率更有用。

于 2011-12-27T12:37:53.693 回答