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