CADisplayLink 刷新 openGL 视图和 UIApplication 的 sendEvent 方法似乎存在一些优先级冲突。我为此苦苦挣扎了一周!在我的测试中,我发现只要您的手指移动,每次屏幕刷新都会触发 UIPanGestureRecognizer。刷新 GLKView(或我假设的任何 openGL 上下文)时,识别器每隔一段时间就会跳过几帧。如果您连接 CADisplayLink 以刷新 GLKView 并平移您可以自己看到它。
-(void)panRecCallback:(UIPanGestureRecognizer *)rec{
CGPoint loc = [panRec locationInView:self.view];
printf(" rec loc %3.3f %3.3f\n",loc.x,loc.y);
}
-(void)display:(CADisplayLink *)displayLink{
[myGLKView display];
CGPoint loc = [panRec locationInView:self.view];
printf("display loc %3.3f %3.3f\n",loc.x,loc.y);
}
我从来没有完全弄清楚它,但我确实找到了一种超级hacky 的方法来让它始终如一地顺利工作。我发现在故障期间,识别器正在等待一个信号量,我认为这意味着 openGL 的绘图是在识别器的选择器触发之前发生的,并且它以某种方式滞后到足以阻止一个循环。所以我的目标是延迟识别器,使其在下一次渲染之前触发。这是破解部分,我在主线程上 dispatch_async 触发 my[glkView display]
以便调用我的识别器,然后我在一个块中捕获识别器操作并在循环过去后触发它。我不想说这是我所能做的,但我工作!