4

私は UIPanGestureRecognizer を使用してゲーム (cocos2d 2.0) をパンします。iOS 5.x から 6.x まで正常に動作しています。突然、iOS 7 で非常に途切れ途切れになりました。しばらくはパンできますが、最終的には不正確になります。私のゲーム コードがジェスチャで何かを行う前であっても、翻訳が 3 ~ 5 ポイント前後ジャンプしていることをログで明確に確認できます。通常、スムーズな指のドラッグでは、変更ごとに 1 ポイントだけ移動が広がります。画面の端近くをスワイプするとすぐに問題が発生するようですが、パンするだけでも問題が発生します。

cocos2d で問題を引き起こすような変更はありましたか? それとも一般的なジェスチャ認識機能ですか?

4

1 に答える 1

0

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]実行して、認識エンジンが呼び出されるようにし、認識エンジンのアクションをブロックにキャプチャして、サイクルが経過した後に起動します。これが私にできるすべてだとは言いたくありませんが、うまくいきます!

于 2015-06-17T23:41:14.100 に答える