Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

Surface和SurfaceHolder

表面對象使應用程序可以渲染要在屏幕上呈現的圖像。 SurfaceHolder界面使應用程序可以編輯和控製曲面。

表面

表面是生產者與消費者交換緩衝區的接口。

通常將用於顯示表面的BufferQueue配置為三重緩衝。緩衝區是按需分配的,因此,如果生產者生成緩衝區的速度足夠慢,例如在60 fps的顯示屏上以30 fps的速度生成,則隊列中可能只有兩個分配的緩衝區。按需分配緩衝區有助於最大程度地減少內存消耗。您可以在dumpsys SurfaceFlinger輸出中看到與每個層關聯的緩衝區的摘要。

大多數客戶端使用OpenGL ESVulkan在表面上進行渲染。但是,某些客戶端使用畫佈在表面上渲染。

畫布渲染

Skia實現由Skia圖形庫提供 。如果要繪製矩形,請調用Canvas API,該API會適當設置緩衝區中的字節。為確保緩衝區不會被兩個客戶端同時更新或在顯示時不會被寫入,請鎖定該緩衝區以對其進行訪問。使用以下命令來使用畫布鎖:

生產者第一次從BufferQueue請求緩衝區時,該緩衝區被分配並初始化為零。必須進行初始化,以避免無意間在進程之間共享數據。但是,如果重用緩衝區,則先前的內容仍然存在。如果您重複調用lockCanvas()unlockCanvasAndPost()而不繪製任何內容,則生成器會在先前渲染的幀之間循環。

表面鎖定/解鎖代碼保留對先前渲染的緩衝區的引用。如果在鎖定曲面時指定了臟區,它將復制前一個緩衝區中的髒像素。 SurfaceFlinger或HWC通常處理緩衝區;但是因為我們只需要從緩衝區中讀取數據,所以無需等待獨占訪問。

SurfaceHolder

SurfaceHolder是系統用來與應用程序共享表面所有權的接口。一些使用曲面的客戶端需要SurfaceHolder,因為獲取和設置曲面參數的API是通過SurfaceHolder實現的。 SurfaceView包含一個SurfaceHolder。

與視圖交互的大多數組件都包含一個SurfaceHolder。其他一些API(例如MediaCodec)在表面本身上運行。