グラフィックのアーキテクチャ

すべてのデベロッパーがサーフェス、SurfaceHolder、EGLSurface、SurfaceView、GLSurfaceView、SurfaceTexture、TextureView、SurfaceFlinger、Vulkan について、把握する必要があること。

このページでは、Android システムレベルのグラフィック アーキテクチャの重要な要素と、アプリのフレームワークおよびマルチメディア システムでの使用方法について説明します。グラフィカル データのバッファがシステム内をどのように移動するかという点に重点をおいて説明します。SurfaceView と TextureView の動作の背景にあるものや、サーフェスと EGLSurface の相互作用に関する疑問について取り扱います。

Android デバイスとアプリ開発にある程度精通されていることを前提とします。API フレームワークの詳細な知識は不要で、API 呼び出しについてもほとんど言及していませんが、コンテンツは他の公開ドキュメントとは重複していません。目標は、出力フレームのレンダリングに関係する重要なイベントの詳細を示し、アプリの設計時に十分な情報に基づいて選択できるようにすることです。これを実現するため、UI クラスの使用方法ではなく、仕組みを初めから説明します。

このセクションでは、背景資料から HAL の詳細、ユースケースまで、あらゆるコンテンツを取り上げます。まず Android のグラフィック バッファについての説明から始め、構成と表示の仕組みを説明し、それからコンポジタにデータを供給する高レベルのメカニズムに進みます。興味のあるトピックだけでなく、順番にページを読み進めていくことをおすすめします。

下位コンポーネント

  • BufferQueue と gralloc。BufferQueue は、グラフィカル データのバッファを生成するもの(プロデューサー)と、そのデータを受け入れて表示や追加処理を行うもの(コンシューマー)を接続します。バッファ割り当ては、ベンダー固有の HAL インターフェースを介して実装された gralloc のメモリ アロケータを介して行われます。
  • SurfaceFlinger、Hardware Composer、および仮想ディスプレイ。SurfaceFlinger は、複数のソースからデータのバッファを受け取り、合成してディスプレイに送信します。Hardware Composer HAL(HWC)は、使用可能なハードウェアでバッファを合成する最も効率的な方法を決定し、仮想ディスプレイは、システム内で合成された出力を使用可能にします(画面を録画またはネットワーク経由で送信します)。
  • Surface、Canvas、および SurfaceHolder。Surface は、SurfaceFlinger でよく使用されるバッファキューを生成します。Surface にレンダリングすると、結果はコンシューマーに送られるバッファに格納されます。Canvas API は、Surface 上に直接描画するために、ハードウェア アクセラレーションのサポートがあるソフトウェア実装を提供します(OpenGL ES の低レベルの代替方法です)。View と関係があるものにはすべて SurfaceHolder があり、その API は、サイズや形式などの Surface パラメータの取得と設定を可能にします。
  • EGLSurface と OpenGL ESOpenGL ES(GLES)は、EGL(オペレーティング システムからウィンドウを作成してアクセスする方法を認識するライブラリ)と組み合わせるように設計されたグラフィック レンダリング API を定義します(テクスチャのあるポリゴンを描画するには GLES 呼び出しを使用し、画面にレンダリングを置くには EGL 呼び出しを使用します)。このページでは、ネイティブ コードから EGL ウィンドウ サーフェスを作成するために使用される Java Surface クラスの C / C++ と同等の ANativeWindow についても説明します。
  • Vulkan。Vulkan は、高パフォーマンスの 3D グラフィックを実現する、低オーバーヘッドのクロス プラットフォーム API です。OpenGL ES と同様に、Vulkan はアプリで高品質のリアルタイム グラフィックを作成するためのツールを備えています。Vulkan のメリットとしては、CPU オーバーヘッドを削減できることや SPIR-V バイナリ中間言語をサポートしていることなども挙げられます。

上位コンポーネント

  • SurfaceView と GLSurfaceView。SurfaceView はサーフェスとビューを結合します。SurfaceView の View コンポーネントは、SurfaceFlinger で作成され(かつアプリでは作成されず)、別のスレッドやプロセスからのレンダリングと、アプリの UI レンダリングからの分離を可能にします。GLSurfaceView には、EGL コンテキスト、スレッド間の通信、アクティビティのライフサイクルとの相互作用を管理するためのヘルパークラスが用意されています(ただし、GLES を使用する必要はありません)。
  • SurfaceTexture。SurfaceTexture は、Surface と GLES テクスチャを結合して、アプリがコンシューマーである BufferQueue を作成します。プロデューサーは、新しいバッファをキューに登録するとアプリに通知します。次に、以前保持していたバッファを解放してキューから新しいバッファを取得し、EGL を呼び出して GLES がバッファを外部テクスチャとして使用できるようにします。Android 7.0 には、保護された動画コンテンツの GPU 後処理を可能にする安全なテクスチャ動画再生のサポートが追加されています。
  • TextureView。TextureView は、ビューを SurfaceTexture と結合します。TextureView は、SurfaceTexture をラップし、コールバックへの応答と新しいバッファの取得を行います。TextureView は描画の際に、最後に受信したバッファのコンテンツをデータソースとして使用し、ビューの状態が示すあらゆる場所、方法でレンダリングします。ビューの構成は常に GLES を使用して実行されるため、コンテンツの更新によって他のビューの要素も再描画される場合があります。