キャンバスとサーフェスの概念を理解する 質問する

キャンバスとサーフェスの概念を理解する 質問する

Android で使用される描画プロセス、つまりシステム全体を理解するのに苦労していますSurfaceViewSurfaceCanvasBitmap

私はAndroid開発者サイトで見つけたすべての記事とAPIドキュメントページ、Androidグラフィックスのチュートリアル、LunarLanderのソースコードなどを読みました。この質問

これらの記述のうちどれが真実で、どれがそうでないか、またその理由を教えてください。

  1. Canvas独自のものがBitmap付いています。Surface独自のものがCanvas付いています。
  2. すべてViewのウィンドウは同じものを共有しSurface、したがって同じものを共有しますCanvas
  3. SurfaceViewは のサブクラスでありView、他のViewのサブクラスや自体とは異なり、を描画するView独自の を持っています。Surface

もう一つの質問があります:

  • ビットマップを使用した高レベルの操作のための がSurfaceすでに存在する場合、 クラスが必要なのはなぜですか。が実行可能な作業を実行するのに適していない状況の例を挙げてください。CanvasCanvasSurface

ベストアンサー1

以下にいくつかの定義を示します。

  • サーフェスは、画面に合成されるピクセルを保持するオブジェクトです。画面に表示されるすべてのウィンドウ (ダイアログ、全画面アクティビティ、ステータス バー) には、描画される独自のサーフェスがあり、Surface Flinger はこれらを正しい Z オーダーで最終ディスプレイにレンダリングします。サーフェスには通常、ダブル バッファ レンダリングを実行するために複数のバッファー (通常は 2 つ) があります。つまり、サーフェス フリンガーが最後のバッファーを使用して画面を合成している間に、アプリケーションが次の UI 状態を描画できるため、アプリケーションの描画が完了するのを待つ必要はありません。

  • ウィンドウは、基本的にデスクトップ上のウィンドウのようなものです。ウィンドウには、ウィンドウの内容がレンダリングされる単一の Surface があります。アプリケーションはウィンドウ マネージャーと対話してウィンドウを作成します。ウィンドウ マネージャーは各ウィンドウの Surface を作成し、それをアプリケーションに渡して描画します。アプリケーションは Surface に必要なものをすべて描画できますが、ウィンドウ マネージャーにとっては、それは単なる不透明な四角形です。

  • ビューは、ウィンドウ内の対話型 UI 要素です。ウィンドウには、ウィンドウのすべての動作を提供する単一のビュー階層が接続されています。ウィンドウを再描画する必要がある場合 (ビューが無効になった場合など)、ウィンドウの Surface に再描画が行われます。Surface はロックされており、描画に使用できる Canvas を返します。階層を下って描画トラバーサルが実行され、各ビューに Canvas が渡されて UI の部分を描画します。完了すると、Surface のロックが解除されてポストされ、描画されたばかりのバッファーがフォアグラウンドにスワップされ、Surface Flinger によって画面に合成されます。

  • SurfaceView は View の特別な実装で、アプリケーションが直接描画するための専用の Surface も作成します (通常のビュー階層の外側で、通常はウィンドウの単一の Surface を共有する必要があります)。この仕組みは想像以上に簡単です。SurfaceView が行うことは、ウィンドウ マネージャーに新しいウィンドウを作成するように要求し、そのウィンドウを SurfaceView のウィンドウのすぐ後ろまたは前に Z オーダーで配置するように指示し、SurfaceView が包含ウィンドウに表示される場所と一致するように配置することだけです。Surface がメイン ウィンドウの後ろ (Z オーダー) に配置されている場合、SurfaceView はメイン ウィンドウのその部分を透明にして、Surface が見えるようにします。

  • ビットマップは、ピクセル データへのインターフェイスにすぎません。ビットマップを直接作成する場合、ピクセルはビットマップ自体によって割り当てられることがあります。また、キャンバスを描画用のサーフェスに接続するときに内部的に発生するような、ビットマップが所有していないピクセルを指すこともあります (ビットマップが作成され、サーフェスの現在の描画バッファーを指します)。

また、これが示唆しているように、SurfaceView はかなり重いオブジェクトであることに留意してください。特定の UI に複数の SurfaceView がある場合は、立ち止まって、これが本当に必要かどうか考えてください。2 つ以上ある場合は、ほぼ間違いなく多すぎます。

おすすめ記事