4

iOSでは、3つCGImageのオブジェクトを作成できCADisplayLink、60fpsで使用できました

self.view.layer.contents = (__bridge id) imageArray[counter++ % 3];

内でViewController、毎回contents、ビットマップであるビューの CALayer に画像が設定されます。

そして、これだけで、画面に表示される内容が変わる可能性があります。画面はこれら 3 つの画像を 60fps でループします。UIViewdrawRectも、CALayerもdisplaydrawInContextCALayer のデリゲートもありませんdrawLayerInContext。CALayer を変更するだけcontentsです。

また、小さいサイズのサブレイヤーを に追加して、代わりにself.view.layerそのサブレイヤーを設定してみました。contentsそして、そのサブレイヤーはこれらの 3 つの画像を循環します。

つまり、これは昔の Apple ][ や King's Quest III 時代の DOS ビデオ ゲームでさえ、ビットマップが 1 つしかなく、常にビットマップが何であるかを画面に表示するのと非常によく似ています。

今回を除いて、それは 1 つのビットマップではなく、ビットマップのツリーまたはリンクされたリストであり、グラフィックス カードは常に Painter's Model を使用して、これらのビットマップを (位置と不透明度とともに) メイン画面に描画します。つまりdrawRect、CALayer はすべて、この最終的な目的を達成するために設計されたようです。

それがどのように機能するのですか?グラフィックカードは、ビットマップの順序付きリストまたはビットマップのツリーを受け取りますか? (そして常にそれらを表示します。単純化するために、CA フレームワークの Implicit アニメーションは考慮しません) グラフィックス カード処理レイヤーで実際に何が起こっているのでしょうか? (実際、この方法は iOS、Mac OS X、PC でほぼ同じですか?)

(この質問は、グラフィック プログラミングが最新のグラフィック カードで実際にどのようにレンダリングされるかを理解することを目的としています。たとえば、UIView と CALayer の仕組みを理解する必要がある場合、または CALayer のビットマップを直接使用する場合でも、グラフィック アーキテクチャを理解する必要があるためです。)

4

2 に答える 2

5

最新のディスプレイ ライブラリ (iOS や Mac OS で使用される Quartz など) は、ハードウェア アクセラレーションによる合成を使用します。仕組みは、OpenGL などのコンピュータ グラフィックス ライブラリの仕組みと非常によく似ています。基本的に、各 CALayer は、3D ゲームのテクスチャのように、ビデオ ハードウェアによってバッファリングおよびレンダリングされる個別のサーフェスとして保持されます。これは iOS で非常にうまく実装されており、これが iPhone がスムーズな UI を持つことで非常によく知られている理由です。

「昔」 (つまり、Windows 9x、Mac OS Classic など) では、画面は基本的に 1 つの大きなフレーム バッファーであり、ウィンドウの移動などによって公開されるものはすべて、アプリケーションごとに手動で再描画する必要がありました。再描画は主に CPU によって行われ、アニメーションのパフォーマンスに上限がありました。アニメーションは通常、再描画が関係しているため、非常に「ちらつき」がありました。この手法は、アニメーションがあまりないデスクトップ アプリケーションに最も適していました。特に、Android はこの手法を使用しています (または少なくとも使用していました)。これは、iOS アプリケーションを Android に移植する際の大きな問題です。

昔のゲーム (例: DOS、アーケード マシンなど、Mac OS クラシックでも多く使用されていました) では、スプライト アニメーションと呼ばれるものを使用して、パフォーマンスを向上させ、アニメーションによってレンダリングされたオフスクリーン バッファーに動画を保持することでちらつきを減らしました。ハードウェアとモニターの vblank と同期しているため、非常にローエンドなシステムでもアニメーションがスムーズでした。ただし、これらの画像のサイズは非常に限られており、画面の解像度は低く、今日の iPhone 画面のピクセル数の約 10 ~ 15% に過ぎませんでした。

于 2012-05-29T23:09:45.640 に答える
3

ここで妥当な直感が得られましたが、 と表示の間にはまだいくつかのステップがcontentsあります。まず、 であるcontents必要はありませんCGImage。多くの場合、プライベート クラスと呼ばCABackingStorageれますが、まったく同じではありません。多くの場合、イメージをメイン メモリにレンダリングしてからビデオ メモリにコピーすることを回避するために、ハードウェアの最適化が行われています。また、contentsさまざまなレイヤーがすべて合成されているため、「実際の」表示メモリからはまだ離れています。への変更contentsは、プレゼンテーションやレンダー レイヤーではなく、モデル レイヤーに直接影響することは言うまでもありません。さらにCGLayer、画像をビデオ メモリに直接保存できるオブジェクトもあります。いろいろなことが起こっています。

答えは、いいえ、ビデオ「カード」(チップ; それは PowerVR BTW です) は、順序付けられた一連のレイヤーを使用しません。十分に文書化されていない方法で低レベルのデータを取得します。一部のもの (特にコア アニメーションの一部、およびおそらく CGLayer) は、OpenGL テクスチャのラッパーのように見えますが、ハードウェア自体に直接アクセスするコア グラフィックスである可能性があります。このレベルのスタックに到達すると、それはすべて非公開になり、バージョンごと、デバイスごとに変更される可能性があります。

また、Brad Larson の回答が役に立つかもしれません: iOS: is Core Graphics implemented on top of OpenGL?

iOS:PTLの第 6 章にも興味があるかもしれません。実装の詳細には立ち入りませんが、描画パフォーマンスを改善し、Core Graphics でハードウェアを最大限に活用する方法について、多くの実践的な議論が含まれています。CALayer第 7 章では、描画に関する開発者がアクセスできるすべての手順について詳しく説明します。

于 2012-05-29T23:51:27.540 に答える