概览#
公式紹介:Android-Graphics
-
Image Stream Producers:グラフィックスプロデューサーで、グラフィックスバッファを生成し、グラフィックスコンシューマーが使用します。例えば OpenGL ES、Canvas 2D、メディアサーバーのビデオデコーダーなど。
-
Native Framework:Libgui ライブラリで、グラフィックスシステムの基本要素を含みます。例えば Surface、BufferQueue、GraphicBufferConsumer、GraphicBufferProducer、SurfaceComposer など。
-
Window Positioning:WindowManager で、window オブジェクトを制御します。window は一組の view オブジェクトの集合です。これは SurfaceFlinger にバッファとウィンドウメタデータを提供し、SurfaceFlinger はこれらの情報を使用して Surface を画面に合成します。
-
Image Stream Consumers:グラフィックスコンシューマーで、SurfaceFlinger やいくつかのグラフィックスアプリケーションを含みます。
- グラフィックスストリームの最も一般的なコンシューマーは SurfaceFlinger で、このシステムサービスは現在表示可能な Surface を消費し、WindowManager から提供された情報を使用してそれらを表示部分に合成します。SurfaceFlinger は OpenGL と Hardware Composer を使用して一組の Surface を合成します。
- 一部の OpenGL ES アプリもコンシューマーとして機能します。例えばカメラアプリはカメラプレビュー画像ストリームを消費します。非 GL アプリもコンシューマーになり得ます。例えば ImageReader クラスです。
-
HAL:表示サブシステムのハードウェア抽象実装で、Hardware Composer と Gralloc を含みます。
- SurfaceFlinger は特定の合成作業を Hardware Composer に委任し、OpenGL と GPU の作業負荷を軽減します。この場合、SurfaceFlinger は別の OpenGL ES クライアントとして機能し、Hardware Composer がグラフィックスレンダリングの作業を行います。Hardware Composer はイベントをサポートする必要があり、その一つは VSYNC(もう一つはプラグアンドプレイ HDMI のホットプラグ)です。
- Gralloc はグラフィックスプロデューサーが要求するメモリを割り当てるために使用されます。
BufferQueue#
公式紹介:Android-BufferQueue
左側のオブジェクトはグラフィックスバッファを生成するレンダラーで、主画面、ステータスバー、システムインターフェースなどがあります。SurfaceFlinger は合成器で、Hardware Composer はプロデューサーです。BufferQueue は Android グラフィックスシステムの重要な構成要素で、データの伝達を担当します。
図の producer と consumer は異なるプロセスで実行され、BufferQueue はバッファプールとキューを組み合わせたデータ構造で、Binder IPC を使用してプロセス間でバッファを伝達します。いくつかの重要な関数は以下の通りです:
- producers は BufferQueue を介して空いているバッファ(GraphicBuffer)を要求します:IGraphicBufferProducer.dequeueBuffer メソッド
- バッファ(GraphicBuffer)にデータ(描画など)を填充した後、producers はバッファ(GraphicBuffer)を BufferQueue にキューイングします:IGraphicBufferProducer.queueBuffer メソッド
- consumer は BufferQueue からバッファ(GraphicBuffer)をデキューします:IGraphicBufferConsumer.acquireBuffer メソッド
- consumer が消費を終えた後(典型的には SurfaceFlinger がデータを合成する)、バッファ(GraphicBuffer)をキューに戻します:IGraphicBufferConsumer.releaseBuffer メソッド
ここで、IGraphicBufferProducer は BufferQueue のプロデューサーインターフェースで、実装クラスは BufferQueueProducer プロデューサークラスです;IGraphicBufferConsumer は BufferQueue のコンシューマーインターフェースで、実装クラスは BufferQueueConsumer コンシューマークラスです。
SurfaceFlinger#
SurfaceFlinger は現在表示可能な Surface を管理し、すべてのレンダリングされた可視 Surface は SurfaceFlinger が WindowManager から提供された情報を使用して合成し(OpenGL と Hardware Composer を使用)、画面の後バッファに提出され、次の Vsync 信号が到着するのを待ってから画面に表示されます。SurfaceFlinger は画面の後バッファを介して画面と接続し、Surface を介して上層と接続し、上と下をつなぐ役割を果たします。
SurfaceFlinger の作業フロー
SurfaceFlinger の registerCallback 時のthisは SurfaceFlinger が ComposerCallback インターフェースを実装したものです。
-
onHotplugReceived
ホットプラグイベントで、ディスプレイが接続または切断されたときにコールバックされます。
-
onRefreshReceived
低レベルの HWComposer からのリフレッシュリクエストを受信します。実装方法は以下の通りです:
void SurfaceFlinger::onRefreshReceived(int sequenceId, hwc2_display_t /*display*/) { Mutex::Autolock lock(mStateLock); if (sequenceId !=getBE().mComposerSequenceId) { return; } repaintEverythingLocked(); } void SurfaceFlinger::repaintEverythingLocked() { android_atomic_or(1, &mRepaintEverything); //リフレッシュをトリガーし、再合成を行います signalTransaction(); }
-
onVsyncReceived
Vsync イベントの報告で、低レベルのハードウェアから報告された垂直同期信号を受信します。
なぜ垂直同期信号が必要なのか、参考にしてくださいhttps://juejin.cn/post/6863756420380196877#heading-1
合成方式#
- Client 合成
各 Layer の内容を GPU でレンダリングし、最終的にそのバッファを表示ハードウェアに送信します。Client 合成は RenderEngine を使用して合成します。
- Device 合成
ハードウェア合成器が HWComposer として合成を行い、その合成方法は各 Layer のデータをすべて表示ハードウェアに渡し、異なるバッファから画面の異なる部分のデータを読み取るように指示します。
HWC 関連図表#
合成図表#
Dump 情報#
adb shell dumpsys SurfaceFlinger
图层#
图层(Layer)は合成の最も重要な単位です。各図層には他の層との相互作用を定義するための一連の属性があります。Layer の各層におけるコードの実装は異なりますが、基本的に Layer の理念は同じです。
frameworks/native/services/surfaceflinger
├── Layer.h
├── Layer.cpp
├── ColorLayer.h
├── ColorLayer.cpp
├── BufferLayer.h
└── BufferLayer.cpp
総括#
全体のグラフィック表示システムは、グラフィックと表示の 2 つのシステムに簡単に分けることができます。
- グラフィックシステムは、描画とグラフィック処理のサポートを提供します。2D の Skia、3D の OpenGLES、さまざまな画像デコーダライブラリなど。
- 表示システムは、グラフィックが描画された後に表示する必要があり、ウィンドウを合成する必要があります。この時、SurfaceFlinger を使用します。上層の表示システムは View、ActivityManagerService、WindowManagerService で構成されています。ウィンドウは 1 つの Surface であり、SurfaceFlinger は Layer を使用してウィンドウを記述します。