2

私のiOSゲームは現在、OpenGLレンダリング操作のタイミングにCADisplayLinkを使用しています。GPUへのすべてのOpenGLレンダリングと状態呼び出しを発行する2番目のスレッドで実行されているGCDディスパッチキューがあります。タイミングが完璧ではないことを除いて、すべてが正常に機能します。アニメーションの間隔を1(60Hz)から2(30Hz)に変更しても、フレームのスキップやグリッチが発生することがあります。

CADisplayLinkは、メインスレッドのRunLoopからセレクターを呼び出します。つまり、メインスレッドが処理している他のディスパッチされたジョブと入力イベントの間でのみセレクターを起動できます。(これらのジョブ/イベントをログに記録することで、これが当てはまることを確認しました)。これらの操作に数ミリ秒かかる場合、CADisplayLinkは、メインスレッドで現在実行されているものを中断できないため、完全に正確になることはありません。ほとんどのゲームがそうであるように、私はゲームシミュレーション、物理学、およびシーンカリングをメインスレッドで実行しています。

ですから、私が考えているのは、タッチイベントとCADisplayLinkが可能な限り近くで起動できるように、すべてのゲームシミュレーションと物理学のものをメインスレッドから移動する必要があるということです。しかし、これで何かが解決するかどうかはわかりませんし、些細な作業でもありません。

presentRenderBuffer呼び出しは実際にはフレームを実際のハードウェア表示と同期させるものなので、必要なのは、それ自体のスレッドで(おそらくより高い優先度で)実行してレンダリングをトリガーできる本当に正確なタイマーだけかもしれません。そのように。その後、すべてをメインスレッドに保持できます。CADisplayLinkが提供するのは、コードが60Hzより速く実行されている場合に待機する方法のようです。したがって、別のスレッドを使用して、同様の種類の遅延を簡単にコーディングできるようです。ここで何が欠けていますか?

4

0 に答える 0