【问题标题】:Choppy touch response on lower FPS较低 FPS 的触摸响应不稳定
【发布时间】:2011-12-26 22:54:12
【问题描述】:

我正在制作一款大量使用像素着色器的 iPhone 游戏。一些效果使我的 fps 速率在 3GS 中有时会下降到 ~22 FPS,但大多数时候它在 ~27 左右。 当 FPS 速率下降时,触摸手势响应变得非常不稳定。也就是说,手势更新时间达到了近5hz,比游戏本身要慢很多。

有没有人遇到过类似的问题?有什么办法吗?

注意 1:我已经在使用 CADisplayLink

编辑:通过手动跳过偶数帧,我有了显着的改进。我不确定这是否是一件好事,但游戏仍然可以玩,而且我确信它现在使用的 CPU 少了很多。

【问题讨论】:

    标签: iphone opengl-es touch frame-rate lag


    【解决方案1】:

    我在我的一个应用程序中遇到了类似的情况,我的着色器非常重,这可能会导致在旧设备上的渲染速度变慢,但我仍然希望在更强大的硬件上尽可能快地帧速率。

    我所做的是对所有与 OpenGL ES 渲染相关的操作使用单个 GCD 串行队列,并结合调度信号量。我使用 CADisplayLink 以 60 FPS 的速度触发,然后在回调中调度一个块用于实际的渲染操作。我使用调度信号量,这样如果 CADisplayLink 在运行时尝试将另一个块添加到渲染队列中,则该新块将被删除并且永远不会添加。

    我在this answer 中详细描述了这种方法,您可以下载我使用此here 的应用程序的源代码。

    GCD 队列可让您将此渲染移至后台线程,让您的界面保持响应,同时缩放 FPS,以便您的渲染运行速度与硬件支持的速度一样快。这在新的双核 iOS 设备上具有特别的优势,因为我注意到仅通过在此后台队列上执行我的 OpenGL ES 更新即可显着提高渲染速度。

    但是,正如我在该答案中所描述的,您需要通过此队列汇集所有 OpenGL ES 更新,以避免多个线程同时访问 OpenGL ES 上下文的可能性(这会导致崩溃)。

    【讨论】:

    【解决方案2】:

    如果您应用的游戏循环以 22 fps 运行,但请求 30 fps,这意味着该应用超额订阅了 UI 运行循环中每秒可用的 CPU 循环总数。要么尝试在后台线程中添加更多内容,要么将您请求的帧速率降低到您实际可以获得的帧速率以下(例如将其设置为 20 fps),以便为 UI 内容留出更多时间,例如触摸事件传递。

    【讨论】:

      猜你喜欢
      • 2015-08-29
      • 1970-01-01
      • 2016-03-14
      • 2021-10-31
      • 2016-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多