Android多媒體系統(tǒng):集成的細微差異
基于與 Android 設備制造商的長期密切合作,ARM 經(jīng)歷了大量常見的集成挑戰(zhàn),尤其是在“零拷貝zero-copy”多媒體管線(media pipeline)方面。盡管面臨的挑戰(zhàn)非常多,但依然有一些潛在的解決方案可以應對。傳統(tǒng)的零拷貝多媒體管線主要目的是消除復制開銷,然而當兩個或多個多媒體處理硬件設備在內存中共享同一緩沖區(qū)空間時,就會出現(xiàn)問題,并且也會以一些非常不同的方式進行通信。軟件驅動程序需要選擇數(shù)據(jù)在緩沖區(qū)中的存儲方式,如像素格式,并確保在 GPU 完成寫入之前,顯示器不會讀取緩沖區(qū)。與組件相互通信的潛在集成問題有關的關鍵領域包括內存分配協(xié)商、像素格式協(xié)商和同步。
● 內存分配協(xié)商對于系統(tǒng)集成設計商來說是一個關鍵的領域,它可以決定系統(tǒng)圖形緩沖區(qū)的內存分配位置和方式。分配內存時需要考慮到訪問內存的底層硬件具備的多項限制。有多個重要問題有待解決,例如,所有組件是否都帶有系統(tǒng) MMU(內存管理單元)?如果不是,那么執(zhí)行某些分配時需要將部分內存分配為連續(xù)的物理內存,以確保所有組件均可以讀取該內存。適用于所有目標組件的理想內存對齊方式是指什么?例如,不同的硬件對于它想要如何在內存中對齊該內存的像素有不同的限制。如果缺乏對系統(tǒng)中每個組件的這種了解,在處理圖形緩沖區(qū)時則可能會出現(xiàn)部分內存訪問非常低效。基礎物理地址寬度是另一個問題,即系統(tǒng)集成設計商可能擁有傳統(tǒng)的 32 位內部顯示管線,不能處理較大的內存塊(例如,可以通過 ARMv8 64 位架構處理的內存塊)。
是否存在某些組件無法訪問的特定內存區(qū)域?或者它們必須訪問的特定區(qū)域?Gralloc 模塊由 Android 的編譯引擎用來分配和管理適用于 2D 和 3D 圖形用途的內存。ARM 提供的 Gralloc 庫可以理解 ARM 多媒體處理器的所有系統(tǒng)限制,并且能夠與 Android 內核的 ION 分配程序(一個統(tǒng)一的共享內存系統(tǒng))配合運行,確??梢葬槍ο到y(tǒng)中的每個處理器執(zhí)行最合適且高效的內存分配。軟件驅動程序由 ARM 多媒體處理器用于實施標準 Linux DMA 緩沖區(qū)內存共享功能。如果所有驅動程序使用同一接口,則同一分配可以由一個處理器寫入并由另一個處理器讀取,從而為平臺上的所有圖形和視頻內容提供零拷貝路徑,確保仍能夠維持盡可能低的內存帶寬開銷。
● 像素格式協(xié)商是需要在系統(tǒng)集成期間關注的第二個領域。務必確保多媒體 IP 解決方案中的每個組件(不論是視頻、GPU 還是顯示)實際上均能夠理解來自其他組件的圖形輸出格式,以及確保每個組件生成的內容均能夠以某種格式被其他組件讀取。例如,盡管視頻處理器可能能夠以五種不同的 YUV 格式寫出視頻幀,如果顯示處理器不支持其中的任何格式,則只能使用 GPU 功能在顯示器上合成視頻?;蛘?,如果顯示處理器不理解帶有預乘 Alpha 值(大多數(shù) Android 用戶界面所使用的)的像素格式,則顯示處理器將成為美化過的幀緩沖區(qū)控制器。最后,即便組件能夠完全理解 32 位 RGBA 像素格式,出于某些未知的原因,顯示的應用程序仍將出現(xiàn)反轉的顏色。這會導致在開發(fā)過程中浪費大量時間,因為不僅需要追蹤哪個組件在排序方面(比如 32 位像素格式的紅色和藍色組分)與其他一切不一致,而且還需要研究如何對它們進行反轉。
● 同步是第三個領域,此處旨在盡可能異步運行以減少排隊和延遲。主要問題在于,當系統(tǒng)中存在零拷貝路徑、并且兩個或多個設備正在直接使用同一個內存時,這些組件之間的同步將變得極為重要。例如,如果顯示處理器在 GPU 或視頻處理器完成寫入之前便開始從緩沖區(qū)中進行讀取,則會導致屏幕出現(xiàn)奇怪的偽像。在較早的 Android 版本(Jellybean 之前)中,渲染流水線中的每個組件通過執(zhí)行以下一系列步驟處理和控制 Android 用戶空間的同步:處理軟件驅動程序中的命令;在硬件中執(zhí)行其任務;等待任務在驅動程序中完成;以及將責任傳遞給管線的下一階段。盡管這會使組件之間的同步方法變得簡單容易,但也會造成管線出現(xiàn)暫停間隙,從而使流暢視覺內容之間出現(xiàn)差異并且中斷最終用戶體驗。但是,一種全新同步化方法 Android Fences 已添加至平臺;只要軟件驅動程序支持它們,則允許在管線的每個階段針對其組件執(zhí)行 CPU 端處理和排隊工作,即便前一階段尚未在硬件中完成。這將大幅縮短一個硬件完成與下一個硬件開始之間的間隔。然而,要充分利用 Android Fences 的優(yōu)勢,還需要渲染管線中的每個組件均支持它們。如果所有組件均支持 Android Fences,但其中一個組件出現(xiàn)漏洞,則會出現(xiàn)問題。如果三個或更多個不同供應商提供的軟件驅動程序均支持 Android Fences,但其中一個出現(xiàn)漏洞,則很難進行追蹤、并且需要與多個供應商一起執(zhí)行三項單獨的調查。同時還有可能出現(xiàn)此種情況:只有當某個供應商的組件使用標準接口與其他供應商的組件進行通信時,該漏洞才會顯現(xiàn)出來。