iOS presentRenderBuffer阻止

时间:2017-01-29 14:40:23

标签: ios opengl-es

设定:

  • 主线程上的CADisplayLink,配置为触发每个间隔
  • iOS 10.2
  • OpenGLES 2.0
  • iPhone 6

-(void)callbackFromCADisplayLink:(CADisplayLink *)dl
{
   u64 tStart = high_res_clock_now();

   <Process input, advance game world, prepare graphics commands>

   // Frame processed
   u64 prePresentElapsed = high_res_clock_now() - tStart;

   [myEAGLContext presentRenderbuffer:GL_RENDERBUFFER];

   // Graphics commands submitted
   u64 postPresentElapsed = high_res_clock_now() - tStart;
}

我发现的是:

  • prePresentElapsed始终位于 0.5-2.5ms 范围内。
  • 基本上有2种图形模式:
  • “快速模式”:postPresentElapsed始终位于 1.5-4ms 范围内
  • “慢速模式”:postPresentElapsed始终在 16ms处悬停
  • 系统以“快速模式”启动,但看似随机退化为“慢速模式”(似乎与大帧峰值无关),然后保持“慢速模式”直到应用程序被放入非活动/后台状态,然后回到活动状态。

显然,由于vsync的下游影响,presentRenderbuffer似乎正在阻塞。

问题:

  1. 导致模式切换的原因是什么?
  2. 如何可靠地保持“快速模式”

1 个答案:

答案 0 :(得分:0)

iOS在修改CPU和GPU的时钟速度方面非常活跃。就操作系统而言,理想的状态是让您的应用程序以最低可能的时钟速度以60fps的速度运行(听起来就像慢速模式中发生的那样)

当您的应用程序启动时,时钟速度开始很高,一旦事情有一段时间安定下来,操作系统会测量您的应用程序并尽可能地降低时钟速度,而不会影响用户经验。这样做是为了节省用户电量并保持设备冷却。

这令人非常沮丧,因为据我所知,没有办法禁用,控制甚至监控这种行为,因此它会使性能测量变得更加困难。这也意味着当应用程序占用繁忙帧时,您必须错过奇数帧,因为时钟速度管理无法提高时钟速度,直到它为时已晚。 / p>