まず、私の質問:iOS Run-Loopをどのように管理しますか?
次の私の理由:私はさまざまなプロトタイプ(v。初期段階の開発)でこれを研究していて、多くの厄介な問題を発見しました。
- まず、入力の問題と実行ループにより、次のことを試してみます。
- 最も推奨されるシステム(CADisplayLink)を使用する場合、CPUの負荷によってバッファーフリップ(presentRenderBuffer)がフレームを待機する必要があると、特定のタッチ入力がドロップされることに注意しました。これはデバイスでのみ発生し、シミュレーターでは発生しません(迷惑なことに、これはメインスレッドでのvsyncブロッキングの待機と、アプリの実行ループプロセスが入力にタッチしてメッセージを食べる方法に関連しているようです)
- 次に推奨されるシステム(NSTimer)を使用する場合、CPU負荷がシミュレーターの特定のポイントに達すると、特定のタッチ入力がドロップされるが、デバイスではドロップされないことに気付きました(これも迷惑です)。NSTimerを使用すると、更新が発生したときの精度も大幅に低下します。
- 最も推奨されていないシステムを使用する場合(mach_absolute_timeから構築された高精度タイマーを使用して内部で管理されている独自のスレッドで実行ループを実行すると、タッチ入力の問題はすべて解消されますが、ASSERTコードは間違ったスレッドにトラップされます。ソフトウェア割り込みに続いて(私のアサートコードはhttp://iphone.m20.nl/wp/?p=1に似ています)問題の原因となった行ですぐにアサートコードトラップを実行するのが本当に好きなので、この解決策は次のとおりです。私にとっては実際には機能しません:デバッグが難しいです。
- 第二に、失われた時間:
- システムを調査していると、フレームレートに関係なく(奇妙なことに、統計的にはvsyncを使用しても意味があると思います)、vsyncで約22%の時間待機していることがわかりました。これは、glFlush / glFinishを移動し、presentRenderBuffer呼び出しを実行する頻度を試して確認しました。これは、ブロックしているgl呼び出しで単にストールするのではなく、AIなどを処理したい重要な時期です。これについて私が考えることができる唯一の方法は、レンダリングをそれ自体のスレッドに移動することですが、シングルプロセッサデバイスでマルチスレッドの再設計を開始することが保証されているかどうかはわかりません。
それで、誰かがこれらの問題の周りに魔法の弾丸を見つけましたか?誰かがこのプラットフォームでキックアスであるキラーランループアーキテクチャを持っていますか?現時点では、私は悪の少ない方を選ばなければならないようです。