Google致力於提高黑人社區的種族平等。 怎麼看。
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

BufferQueue和Gralloc

BufferQueue類將生成圖形數據緩衝區的組件( 生產者 )連接到接受數據以供顯示或進一步處理的組件( 消費者 )。幾乎所有在系統中移動圖形數據緩衝區的東西都依賴BufferQueue。

Gralloc內存分配器執行緩衝區分配,並通過兩個特定於供應商的HIDL接口實現(請參閱hardware/interfaces/graphics/allocator/hardware/interfaces/graphics/mapper/ )。 allocate()函數採用預期的參數(寬度,高度,像素格式)以及一組使用標誌。

BufferQueue生產者和消費者

消費者創建並擁有BufferQueue數據結構,並且可以與生產者存在於不同的進程中。當生產者需要緩衝區時,它通過調用dequeueBuffer()來指定Buffer的寬度,高度,像素格式和使用標誌,從而從BufferQueue請求釋放緩衝區。然後,生產者填充緩衝區,並通過調用queueBuffer()將緩衝區返回到隊列。接下來,使用者使用acquireBuffer()獲取緩衝區並利用緩衝區的內容。使用方完成後,它將通過調用releaseBuffer()將緩衝區返回到隊列。 同步框架控制緩衝區如何在Android圖形管道中移動。

BufferQueue的某些特徵(例如,它可以容納的最大緩衝區數)由生產者和使用者共同確定。但是,BufferQueue根據需要分配緩衝區。除非特性發生變化,否則保留緩衝區。例如,如果生產者請求使用其他大小的緩衝區,則會釋放舊緩衝區,並根據需要分配新緩衝區。

緩衝區內容永遠不會被BufferQueue複製,因為移動這麼多數據效率很低。相反,緩衝區始終由句柄傳遞。

使用Systrace跟踪BufferQueue

要了解圖形緩衝區如何移動,請使用Systrace ,該工具可以在短時間內記錄設備活動。系統級別的圖形代碼以及許多相關的應用程序框架代碼,都有很好的工具。

要使用Systrace,請啟用gfxviewsched標籤。 BufferQueue對象顯示在跟踪中。例如,如果在運行Grafika的Play視頻(SurfaceView)時進行跟踪,則標記為SurfaceView的行將告訴您在任何給定時間排隊了多少緩衝區。

當應用程序處於活動狀態時,該值會增加,這會觸發MediaCodec解碼器渲染幀。當SurfaceFlinger工作並消耗緩衝區時,該值減小。當以30 fps的速度顯示視頻時,隊列的值在0到1之間變化,因為〜60 fps的顯示可以與源保持同步。僅當有工作要做時,SurfaceFlinger才會喚醒,而不是每秒60次。如果沒有任何更新屏幕,系統將嘗試避免工作並禁用VSYNC。

如果切換到Grafika的Play視頻(TextureView)並獲取新的軌跡,則會看到標記為com.android.grafika / com.android.grafika.PlayMovieActivity的行。這是主UI層,它是另一個BufferQueue。因為TextureView渲染到UI層而不是單獨的層,所以所有視頻驅動的更新都顯示在此處。

格蘭索

Gralloc分配器HAL hardware/libhardware/include/hardware/gralloc.h通過使用標誌執行緩衝區分配。使用標誌包括以下屬性:

  • 從軟件(CPU)訪問存儲器的頻率
  • 從硬件(GPU)訪問內存的頻率
  • 內存是否將用作OpenGL ES(GLES)紋理
  • 視頻編碼器是否使用內存

例如,如果生產者的緩衝區格式指定RGBA_8888像素,並且生產者指示將通過軟件訪問該緩衝區(這意味著應用程序將觸摸CPU上的像素),則Gralloc將創建一個緩衝區,該緩衝區按RGBA順序每像素4個字節。如果相反,生產者指定只能從硬件訪問其緩衝區,並且作為GLES紋理,Gralloc可以執行GLES驅動程序想要的任何事情,例如BGRA排序,非線性模糊佈局和其他顏色格式。允許硬件使用其首選格式可以提高性能。

某些值不能在某些平台上組合。例如,視頻編碼器標誌可能需要YUV像素,因此添加軟件訪問權限和指定RGBA_8888失敗。

Gralloc返回的句柄可以通過Binder在進程之間傳遞。

受保護的緩衝區

Gralloc使用標誌GRALLOC_USAGE_PROTECTED允許僅通過硬件保護的路徑顯示圖形緩衝區。這些覆蓋平面是顯示DRM內容的唯一方法(SurfaceFlinger或OpenGL ES驅動程序無法訪問受DRM保護的緩衝區)。

受DRM保護的視頻只能在覆蓋平面上呈現。支持受保護內容的視頻播放器必須使用SurfaceView實施。在不受保護的硬件上運行的軟件無法讀取或寫入緩衝區。受硬件保護的路徑必須出現在Hardware Composer疊加層上(也就是說,如果Hardware Composer切換到OpenGL ES合成,受保護的視頻將從顯示中消失)。

有關受保護內容的詳細信息,請參閱DRM