10

UIViewsOpenGL ES ビュー (具体的には、GLKit の を使用)に 2D 要素を表示するゲームを開発しておりGLKView、位置を完全に同期させるのに問題があります。

親ビューのlayoutSubviewsでは、世界の 3D 位置を画面に投影し、それらをUIViewゲーム内のいくつかの「マーカー」の位置として使用しています。ゲーム全体は、ユーザーがカメラを動かしたことに応じてのみ更新され、カメラはsetNeedsLayout移動するたびにビューを伝えます。

マーカーが 3D レンダリングとほぼ 1 フレーム同期していないように見えることを除いて、すべてが正常に機能しています。大雑把に言っているのは、 (1) 見積もりだからです! (2)潜在的なマルチスレッドの問題があるかどうか疑問に思っていGLKViewます.特別な画面更新コールバックなどに同期しませんか?

ビューのlayoutSubviewsをフックして、3dビューの更新に同期させる方法はありますか?

Update: Weirdly, calling layoutIfNeeded immediately after setNeedsLayout makes the problem worse! Possibly 2 or more frames out. Really don't understand that!

4

2 に答える 2

0

これは、OpenGL を使用してビデオのフレームを描画しないと正しく実行できません (1 つのフレームに同じ時間のビデオとアニメーションが含まれていることを常に確認できるように、同じコンテキストで描画します)。あなたが行う他のすべて、フレームレート補正、ラグ予測は、偶然にのみ依存し、常に少し非同期になります.

よくわかりませんUIViewが、オーディオを再生してフレームをテクスチャにコピーする方法があれば、それを実行してください。オーディオの遅延は、ビデオよりもはるかに簡単に補正でき、人間にはほとんど気付かれません。

于 2014-05-28T08:57:36.387 に答える