CADisplayLink が openGL ビューを更新し、UIApplication の sendEvent メソッドと優先順位が競合しているようです。私はこれに1週間苦労しました!私のテストでは、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);
}
完全に理解することはできませんでしたが、一貫してスムーズに動作させるための非常にハックな方法を見つけました。グリッチの間、レコグナイザーがセマフォを待っていたことがわかりました。これは、レコグナイザーのセレクターが起動する前に openGL の描画が行われていたことを意味し、何らかの形でサイクルをブロックするのに十分なほど遅れていたことを意味します。したがって、私の目標は、次のレンダリングの前に起動するように認識エンジンを遅らせることでした。これがハック部分です。メインスレッドでdispatch_asyncを[glkView display]
実行して、認識エンジンが呼び出されるようにし、認識エンジンのアクションをブロックにキャプチャして、サイクルが経過した後に起動します。これが私にできるすべてだとは言いたくありませんが、うまくいきます!