Ios

CADisplaylinkとそのアプリケーション



Cadisplaylink Its Applications



CADisplaylinkとは何ですか?
CADisplaylinkとは何ですか。 Appleの公式ドキュメントの説明を見てみましょう。
[quote] CADisplayLinkオブジェクトは、アプリケーションがその描画をディスプレイのリフレッシュレートに同期できるようにするタイマーオブジェクトです。
[/見積もり]
ご覧のとおり、CADisplaylinkは、アプリケーションの図面を表示の更新と同期させるために使用できるタイマーオブジェクトです。より一般的に言えば、電子ディスプレイ画面は1つのピクセルで構成されています。画面に表示されるコンテンツを変更するには、これらのピクセルのカラー値を特定の頻度で更新する必要があり、システムは更新されるたびにCADisplaylinkをトリガーします。

CADisplaylinkの使用方法
CADisplaylinkを使用する場合は、ターゲットとセレクターを使用して表示リンクオブジェクトを作成してから、作成したオブジェクトをrunloopに追加する必要があります。コードは次のとおりです。

CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkTriggered)]
[displayLink setPaused:YES]
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]

CADisplayLinkオブジェクトがRunloopに追加されると、画面を更新する必要があるときにセレクターがコールバックされます。セレクターへの呼び出しを一時停止する場合は、pausedプロパティをYESに設定することでこれを行うことができます。 CADisplayLinkが使用されなくなったら、invalidateメソッドを呼び出して、すべてのRunloopからCADisplayLinkを削除する必要があります。

フレームレートと時間の情報は、CADisplayLinkオブジェクトのプロパティduration、frameInterval、およびタイムスタンプを介してセレクターで取得できます。それらの使用法は、以下の例で説明されます。

アプリのカスタムアニメーション
UIKitおよびCoreAnimationフレームワークは、開発者がさまざまなアニメーションを実装するための豊富なインターフェイスをすでに提供しています。これらのインターフェイスは、単純な平行移動、回転、せん断、ストレッチ、またはそれらの組み合わせを可能にするだけでなく、これらのアニメーションのタイミング機能も制御します。

アニメーション内の要素の位置が空間的に変化する場合、または時間の速度をAppleが提供する単純な基本変換でオーバーレイできない場合は、キーフレームアニメーションインターフェイスやカスタム時間関数など、より複雑なインターフェイスを使用する必要があります。一部の特別なアニメーションでは、次のアニメーションなど、DisplayLinkを使用してこれを行うことができます。
[img] http://dl2.iteye.com/upload/attachment/0118/1958/9934b110-4cc1-3b19-9c35-597b0bf265a5.gif [/ img]
一見複雑ではありませんが、アイコンが落ちると重力感があることを強調しているので、アイコンが落ちて跳ね返る速度が変わります。アイコン自体も重力と垂直方向の衝突によって引き起こされます。圧縮と緩和、Appleの基本的な変換と実装する時間関数を使用して実際の物理的特性をシミュレートするこれらの効果は、同じ効果を達成するためにさまざまなパラメーターをデバッグするのに多くの時間がかかります。デザイナーがavi形式のアニメーションビデオを提供しており、アニメーション内の要素の位置が比較的簡単に変更されるため、Matlabを使用してアニメーションビデオの各フレーム内のオブジェクトの位置情報を抽出し、更新することにしました。セレクターの位置情報に従って表示します。または、レイヤーまたはフレームの制約。

このスキームでは、アニメーション内の要素のモーションの詳細を考慮する必要がなく、実装は比較的簡単です。最終的な効果も特定のアニメーションビデオと一致しますが、固有の欠点もあります。まず、単純な特殊なアニメーション効果しか使用できません。重要な部分は、Matlabを使用してアニメーションのキーフレームデータを抽出することです。この操作は、アニメーション要素が少なく、要素が単純に変換されているアニメーションにのみ実装できます。次に、アニメーション効果が変更された場合、キーフレームデータを再抽出する必要があります。アニメーションの変更とデバッグは同時に不便です。設計者がアニメーションに大幅な変更を加えた場合、このスキームは適用できなくなる可能性があります。

Appleのドキュメントには、アプリケーションが時間内に表示フレームを提供できない場合は、フレームレートを下げる必要があることも記載されています。これは、低いがコヒーレントなフレームレートが高いフレームレートよりもスムーズであるが、フレームがドロップされるためです。 。 frameIntervalプロパティの値を増やすことで、アニメーションのフレームレートを下げることができます。 frameIntervalのデフォルト値は1で、セレクターが数フレームごとに1回呼び出されることを示します。紙詰まりがない場合、iOSデバイスの画面には1秒あたり60回の更新が表示されます。つまり、frameIntervalがデフォルト値の場合、1秒あたり60回コールバックされます。 frameIntervalを2に変更すると、1秒間に30(60/2)回呼び出されます。

アプリケーションフレームレートインジケーター
アプリケーションインターフェイスがスムーズであるかどうかは、ユーザーエクスペリエンスの非常に重要な側面であり、フレームレート(FPS)は、インターフェイスがスムーズであるかどうかのデジタル指標です。一部の情報はInstrumentsで表示できますが、実際の操作パスは長く、実際の使用は少なくなります。

アプリケーションの現在のフレームレートをいつでも視覚的に確認するために、フレームレートインジケータをアプリケーションに追加できます。いつでも見ることができる効果を実現するために、このインジケーターを特別なウィンドウに配置し、このウィンドウのWindowLevelをアプリケーション内の他のウィンドウのwindowLevelよりも高く設定します。同時に、アプリケーションの通常の操作への影響を減らすために、この特別なウィンドウはstatusBarの一部のみをカバーします。

実際、Appleの公式ドキュメントには、ディスプレイのフレームレートを計算するためのCADisplaylinkの使用について明示的に記載されています。
[quote] durationプロパティはフレーム間の時間を提供します。アプリケーションでこの値を使用して、表示のフレームレート、次のフレームが表示されるおおよその時間を計算し、次のフレームが表示される時間に準備されるように描画動作を調整できます。
[/見積もり]
以上のことから、通常の場合、durationの値は1/60である必要がありますが、メインスレッドがブロックされたり、アプリケーションが更新された限られた時間内に必要な操作を完了しなかったりすると、durationの値は増加すると、各フレームの継続時間の値が渡されます。実際のフレームレートを計算できます。

このソリューションの実装は複雑ではなく、興味のある読者が閲覧できるRRFPSBarなど、多くの同様の実装がGithubにあります。フレームレート表示自体も一定量のリソースを占有し、実際のフレームレートに影響を与えるため、実装であまり多くの操作を行うことは適切ではありません。

総括する
CADisplaylinkはNSTimerと非常によく似ています。特定の間隔でコールバックセレクターをトリガーできます。違いは、CADisplaylinkの時間間隔が画面のリフレッシュレートに関連していることです。これにより、CADisplaylinkのアプリケーションが表示に関連していることがわかります。