1. ホーム
  2. android

[解決済み] CanvasとSurfaceの概念を理解する

2022-09-22 14:26:17

質問

への描画処理を理解するのに苦労しています。 SurfaceView に描画され、その結果、全体の Surface / Canvas / Bitmap という、Androidで採用されている方式を採用しています。

私は、android-developers のサイトで見つけることができたすべての記事と API ドキュメントページ、android graphics のいくつかのチュートリアル、LunarLander のソースコード、そして、android-developers のサイトで見つけた この質問 .

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

  1. Canvas は、独自の Bitmap が付加されている。 Surface には、それ自身の Canvas が付加されています。
  2. すべての View のウィンドウは同じ Surface を共有し、その結果、同じ Canvas .
  3. SurfaceView のサブクラスです。 View とは異なり、他の View のサブクラスや View 自体が、その Surface で描画する。

また、追加で1つ質問があります。

  • なぜ Surface クラスが既に存在するのであれば Canvas があれば、ビットマップを使った高水準の操作のために のような状況の例を挙げてください。 Canvas が適していない例を挙げて下さい。 Surface ができる仕事をするのに適していない。

どのように解決するのですか?

いくつかの定義があります。

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

  • ウィンドウは基本的に、デスクトップ上のウィンドウを考えているようなものです。 ウィンドウのコンテンツがレンダリングされる単一のサーフェスを持っています。 アプリケーションは Window Manager とやり取りしてウィンドウを作成します。Window Manager は各ウィンドウに Surface を作成し、描画用にそれをアプリケーションに渡します。 ウィンドウ マネージャは各ウィンドウのサーフェスを作成し、描画用にアプリケーションに渡します。アプリケーションはサーフェスに好きなものを描くことができますが、ウィンドウ マネージャにとってそれは単なる不透明な四角形です。

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

  • SurfaceView は、アプリケーションが直接描画するために、それ自身の専用の Surface を作成する View の特別な実装です(通常のビュー階層の外側で、それ以外はウィンドウ用の単一の Surface を共有しなければなりません)。 SurfaceViewが行うことは、ウィンドウマネージャに新しいウィンドウを作成するように依頼し、そのウィンドウをSurfaceViewのウィンドウのすぐ後ろか前にZオーダーするように指示し、SurfaceViewが含まれているウィンドウに表示される場所に一致するように配置することです。 表面がメインウィンドウの後ろに(Z順序で)配置されている場合、SurfaceViewは表面が見えるように、メインウィンドウのその部分を透明で埋めます。

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

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