CADisplayLinkサウンドとアニメーションの同期を実行するために使用しています。同期は非常に正確である必要があり、現在 1 で実行CADisplayLinkされているframeIntervalため、セレクターを十分に呼び出すことができません。
粒度を上げる方法はありますか?(frameIntervalは整数プロパティなので、明らかに 1 を下回ることはできません)
CADisplayLinkサウンドとアニメーションの同期を実行するために使用しています。同期は非常に正確である必要があり、現在 1 で実行CADisplayLinkされているframeIntervalため、セレクターを十分に呼び出すことができません。
粒度を上げる方法はありますか?(frameIntervalは整数プロパティなので、明らかに 1 を下回ることはできません)
古い質問ですが、それは興味深い点を提起するので、私は 2 セントを差し上げます。
ドキュメントに記載されているように、
A CADisplayLink object is a timer object that allows your application to synchronize its drawing to the refresh rate of the display.
したがって、1 秒あたり 60 回 (LCD 画面の表示速度) よりも頻繁に更新を取得することはできません。アニメーション自体にはリフレッシュ レートはありません。アニメーションは、画面が更新されるたびに表示される連続的な動きを表します。
音声再生の経験はあまりありませんが、CADisplayLinkリフレッシュレートが足りないことに驚いています。1/60 秒は本当にユーザーの耳に違いをもたらすのでしょうか? サウンドの再生に使用している方法が、何らかの遅延を引き起こしているのではないでしょうか?
とにかく、サウンドをアニメーションとより細かく同期させたい場合はNSTimer、 の代わりに、自分に合った繰り返し間隔で を設定することをお勧めしますCADisplayLink。
他に必要なものは次のとおりです。
CACurrentMediaTime()た時点で Core Animation によって使用された時間を返す関数CAAnimation(プロトコルbeginTimeから取得)CAMediaTimingbeginTimeからのオフセットとして設定CACurrentMediaTimeすると、非常に正確で制御された時間に開始するアニメーションを作成できます。アニメーションをレイヤーに追加するときに 0 (デフォルト) のままにしておくとCACurrentMediaTime、ランループの最後に自動的に設定され、タイミングの制御が難しくなります。
beginTimeまた、ランニングから読み取ってCAAnimation、開始した正確な時間を知ることもできます。これは、レイヤーに追加した正確な時間ではない場合があります (上記を参照)。