圖層和螢幕是代表組合作業的兩個基本功能 以及螢幕硬體的互動情形
圖層
圖層是組合中最重要的單位。圖層是 surface 和 SurfaceControl
例項的組合。每個圖層都有一組屬性,用於定義與其他圖層的互動方式。圖層屬性的說明如下表所示。
資源 | 說明 |
---|---|
位置 | 定義圖層在螢幕上的顯示位置。包含圖層邊緣的位置和相對於其他圖層的 Z 順序等資訊 (也就是圖層應位於其他圖層前方還是後方)。 |
內容 | 定義圖層上顯示的內容,應如何在位置屬性定義的邊界內顯示。包含下列資訊: 轉換成裁剪 (將部分內容展開以填滿圖層的邊界) (顯示旋轉或翻轉的內容)。 |
樂曲 | 定義此圖層應如何與其他圖層合成。包含alpha 合成的混合模式和圖層層級 alpha 值等資訊。 |
最佳化 | 提供資訊不足以正確整合所需的資訊 但可由 Hardware Composer (HWC) 裝置使用 以最佳化組合表現包含圖層的可見區域和圖層自上一個影格以來更新的部分等資訊。 |
螢幕
「螢幕」是另一個重要的組成單位。系統可以 包含多個螢幕 螢幕可在正常系統作業期間新增或移除。系統會根據 HWC 或架構的要求,新增/移除螢幕。當外接螢幕連線或與裝置中斷連線時,HWC 裝置會要求新增或移除螢幕,這稱為「hotplugging」。用戶端要求虛擬螢幕,其中的內容 會算繪為螢幕外緩衝區,而非實體螢幕。
虛擬螢幕
SurfaceFlinger 支援內建螢幕 (手機或平板電腦內建螢幕)、外接螢幕 (例如透過 HDMI 連接的電視) 以及一或多個虛擬螢幕 以便在系統內提供合成輸出。虛擬螢幕可用於錄製螢幕畫面,或透過網路傳送螢幕畫面。已產生影格 虛擬螢幕的安裝工作都會寫入 BufferQueue。
虛擬螢幕可能會共用與主要螢幕相同的圖層組合 (層堆疊) 或自己的集合。虛擬顯示器沒有 VSYNC,因此內部顯示器的 VSYNC 會觸發所有顯示器的組合。
支援的 HWC 實作項目 螢幕可以合成 OpenGL ES (GLES)、HWC 或 GLES 和 HWC。 在不支援的實作上,虛擬螢幕一律會以 GLES。
個案研究:螢幕錄影
screenrecord
指令可讓使用者將螢幕上顯示的所有內容錄製為磁碟上的 .mp4
檔案。為實現這項功能,系統會接收來自 SurfaceFlinger 的經過合成的影格,將影格寫入影片編碼器,然後將經過編碼的影片資料寫入檔案。影片轉碼器是透過其他程序管理
(mediaserver
),因此大型圖形緩衝區必須在
有些人會將 Cloud Storage 視為檔案系統
但實際上不是為了增加難度,目標是錄製 60 fps 影片,且解析度為全解析度。讓這項工作更有效率的關鍵是 BufferQueue。
MediaCodec
類別可讓應用程式在緩衝區或透過介面,以原始位元組的形式提供資料。screenrecord
要求存取影片時
編碼器,mediaserver
程序會建立 BufferQueue
然後將生產端傳回
screenrecord
為平面。
接著,screenrecord
公用程式會要求 SurfaceFlinger 建立
仿照主螢幕的虛擬螢幕 (也就是說,搭載相同的硬體)
) 並指示其將輸出內容傳送至來自於
mediaserver
程序。在本例中,SurfaceFlinger 是生產端
緩衝區 (而非取用端) 執行
設定完成後,screenrecord
會在下列情況觸發:
編碼資料出現隨著應用程式繪製,他們的緩衝區會流向 SurfaceFlinger
這會合併成一個緩衝區,並直接傳給影片
mediaserver
程序中所用的編碼器。無論如何
,中繼資料就會在 screenrecord
處理程序中顯示。在內部,mediaserver
程序會以自己的方式移動緩衝區,並透過句柄傳遞資料,藉此盡量減少額外負擔。
個案研究:模擬次要顯示器
WindowManager 可以要求 SurfaceFlinger 建立可見圖層 SurfaceFlinger 可做為 BufferQueue 用戶。您也可以要求 SurfaceFlinger 建立虛擬螢幕,SurfaceFlinger 會充當 BufferQueue 供應者。
如果您將虛擬螢幕連接至可見層,就會建立封閉式迴圈
會在視窗中顯示複合畫面。該視窗現在是
複合輸出內容,因此下次重新整理視窗中的合成圖片
也會顯示視窗內容如要查看實際運作情形,請在「設定」中啟用「開發人員選項」,選取「模擬次要螢幕」,然後啟用視窗。如要查看次要螢幕的實際運作情形,請使用 screenrecord
擷取啟用螢幕的動作,然後逐格播放。