架構(gòu)1--BufferQueue 和 gralloc

轉(zhuǎn)自:https://source.android.com/devices/graphics/?hl=zh-cn

BufferQueue 和 gralloc

要了解 Android 圖形系統(tǒng),需首先了解后臺(tái)的 BufferQueue 和 gralloc HAL。

BufferQueue 類是 Android 中所有圖形處理操作的核心榜晦。它的作用很簡單:將生成圖形數(shù)據(jù)緩沖區(qū)的一方(生產(chǎn)方)連接到接受數(shù)據(jù)以進(jìn)行顯示或進(jìn)一步處理的一方(消耗方)杈湾。幾乎所有在系統(tǒng)中移動(dòng)圖形數(shù)據(jù)緩沖區(qū)的內(nèi)容都依賴于 BufferQueue蒸绩。

gralloc 內(nèi)存分配器會(huì)進(jìn)行緩沖區(qū)分配紊遵,并通過供應(yīng)商特定的 HAL 接口來實(shí)現(xiàn)(請(qǐng)參見hardware/libhardware/include/hardware/gralloc.h)蝠检。alloc()函數(shù)獲得預(yù)期的參數(shù)(寬度、高度肝箱、像素格式)以及一組用法標(biāo)記(詳見下文)。

BufferQueue 生產(chǎn)方和消耗方

基本用法很簡單:生產(chǎn)方請(qǐng)求一個(gè)可用的緩沖區(qū) (dequeueBuffer())稀蟋,并指定一組特性煌张,包括寬度、高度退客、像素格式和用法標(biāo)記骏融。生產(chǎn)方填充緩沖區(qū)并將其返回到隊(duì)列 (queueBuffer())。隨后,消耗方獲取該緩沖區(qū) (acquireBuffer()) 并使用該緩沖區(qū)的內(nèi)容绎谦。當(dāng)消耗方操作完畢后管闷,將該緩沖區(qū)返回到隊(duì)列 (releaseBuffer())。

最新的 Android 設(shè)備支持“同步框架”窃肠,這使得系統(tǒng)能夠在與可以異步處理圖形數(shù)據(jù)的硬件組件結(jié)合使用時(shí)提高工作效率包个。例如,生產(chǎn)方可以提交一系列 OpenGL ES 繪制命令冤留,然后在渲染完成之前將輸出緩沖區(qū)加入隊(duì)列碧囊。該緩沖區(qū)伴有一個(gè)柵欄,當(dāng)內(nèi)容準(zhǔn)備就緒時(shí)纤怒,柵欄會(huì)發(fā)出信號(hào)糯而。當(dāng)該緩沖區(qū)返回到空閑列表時(shí),會(huì)伴有第二個(gè)柵欄泊窘,因此消耗方可以在內(nèi)容仍在使用期間釋放該緩沖區(qū)熄驼。該方法縮短了緩沖區(qū)通過系統(tǒng)時(shí)的延遲時(shí)間,并提高了吞吐量烘豹。

隊(duì)列的一些特性(例如可以容納的最大緩沖區(qū)數(shù))由生產(chǎn)方和消耗方聯(lián)合決定瓜贾。但是,BufferQueue 負(fù)責(zé)根據(jù)需要分配緩沖區(qū)携悯。除非特性發(fā)生變化祭芦,否則將會(huì)保留緩沖區(qū);例如憔鬼,如果生產(chǎn)方請(qǐng)求具有不同大小的緩沖區(qū)龟劲,則系統(tǒng)會(huì)釋放舊的緩沖區(qū),并根據(jù)需要分配新的緩沖區(qū)轴或。

生產(chǎn)方和消耗方可以存在于不同的進(jìn)程中昌跌。目前,消耗方始終創(chuàng)建和擁有數(shù)據(jù)結(jié)構(gòu)侮叮。在舊版本的 Android 中避矢,只有生產(chǎn)方才進(jìn)行 Binder 處理(即生產(chǎn)方可能在遠(yuǎn)程進(jìn)程中,但消耗方必須存在于創(chuàng)建隊(duì)列的進(jìn)程中)囊榜。Android 4.4 和更高版本已發(fā)展為更常規(guī)的實(shí)現(xiàn)审胸。

BufferQueue 永遠(yuǎn)不會(huì)復(fù)制緩沖區(qū)內(nèi)容(移動(dòng)如此多的數(shù)據(jù)是非常低效的操作)。相反卸勺,緩沖區(qū)始終通過句柄進(jìn)行傳遞砂沛。

gralloc HAL 用法標(biāo)記

gralloc 分配器不僅僅是在原生堆上分配內(nèi)存的另一種方法;在某些情況下曙求,分配的內(nèi)存可能并非緩存一致碍庵,或者可能完全無法從用戶空間訪問映企。分配的性質(zhì)由用法標(biāo)記確定,這些標(biāo)記包括以下屬性:

從軟件 (CPU) 訪問內(nèi)存的頻率

從硬件 (GPU) 訪問內(nèi)存的頻率

是否將內(nèi)存用作 OpenGL ES (GLES) 紋理

視頻編碼器是否會(huì)使用內(nèi)存

例如静浴,如果您的格式指定 RGBA 8888 像素堰氓,并且您指明將從軟件訪問緩沖區(qū)(這意味著您的應(yīng)用將直接觸摸像素),則分配器必須按照 R-G-B-A 的順序?yàn)槊總€(gè)像素創(chuàng)建 4 個(gè)字節(jié)的緩沖區(qū)苹享。相反双絮,如果您指明僅從硬件訪問緩沖區(qū)且緩沖區(qū)作為 GLES 紋理,則分配器可以執(zhí)行 GLES 驅(qū)動(dòng)程序所需的任何操作 - BGRA 排序得问、非線性攪和布局囤攀、替代顏色格式等。允許硬件使用其首選格式可以提高性能宫纬。

某些值在特定平臺(tái)上無法組合焚挠。例如,視頻編碼器標(biāo)記可能需要 YUV 像素漓骚,因此將無法添加軟件訪問權(quán)并指定 RGBA 8888蝌衔。

gralloc 分配器返回的句柄可以通過 Binder 在進(jìn)程之間傳遞。

使用 Systrace 跟蹤 BufferQueue

要真正了解圖形緩沖區(qū)如何移動(dòng)蝌蹂,請(qǐng)使用 Systrace胚委。系統(tǒng)級(jí)圖形代碼經(jīng)過很好的檢測,很多相關(guān)的應(yīng)用框架代碼也是如此叉信。

要完整地說明如何有效地使用 Systrace,則需要很長的篇幅艘希。我們首先介紹如何啟用gfx硼身、view和sched標(biāo)記。您還將在跟蹤記錄中看到 BufferQueue覆享。如果您以前使用過 Systrace佳遂,則可能已經(jīng)見到過它們,但不知道它們是什么撒顿。例如丑罪,如果您在Grafika的“播放視頻 (SurfaceView)”正在運(yùn)行時(shí)獲取跟蹤記錄,則標(biāo)有 SurfaceView 的行會(huì)告訴您在任何給定時(shí)間排隊(duì)的緩沖區(qū)數(shù)量凤壁。

當(dāng)應(yīng)用處于活動(dòng)狀態(tài)時(shí)吩屹,該值會(huì)遞增(觸發(fā) MediaCodec 解碼器渲染幀),而在 SurfaceFlinger 正在工作和消耗緩沖區(qū)時(shí)拧抖,該值會(huì)遞減煤搜。當(dāng)以 30fps 的幀率顯示視頻時(shí),隊(duì)列的值從 0 變?yōu)?1唧席,因?yàn)榇蠹s 60fps 的顯示速度可以輕松跟上來源的幀率擦盾。(另請(qǐng)注意嘲驾,SurfaceFlinger 僅在有工作要執(zhí)行時(shí)才被喚醒,而不是每秒喚醒 60 次迹卢。系統(tǒng)會(huì)盡力嘗試避免工作辽故,而且如果屏幕沒有任何更新,將完全停用 VSYNC腐碱。)

如果您切換到 Grafika 的“播放視頻 (TextureView)”并獲取新的跟蹤記錄誊垢,將看到一個(gè)標(biāo)為 com.android.grafika/com.android.grafika.PlayMovieActivity 的行。這是主界面層喻杈,其只是另一個(gè) BufferQueue彤枢。由于 TextureView 渲染到界面層(而不是單獨(dú)的層),因此您將在此看到所有視頻驅(qū)動(dòng)的更新筒饰。

有關(guān) Systrace 工具的更多信息缴啡,請(qǐng)參閱Systrace 文檔

Except as otherwise noted, the content of this page is licensed under theCreative Commons Attribution 3.0 License, and code samples are licensed under theApache 2.0 License. For details, see ourSite Policies. Java is a registered trademark of Oracle and/or its affiliates.

Last updated 九月 13, 2017.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瓷们,一起剝皮案震驚了整個(gè)濱河市业栅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谬晕,老刑警劉巖碘裕,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異攒钳,居然都是意外死亡帮孔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門不撑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來文兢,“玉大人,你說我怎么就攤上這事焕檬∧芳幔” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵实愚,是天一觀的道長兼呵。 經(jīng)常有香客問我,道長腊敲,這世上最難降的妖魔是什么击喂? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮兔仰,結(jié)果婚禮上茫负,老公的妹妹穿的比我還像新娘。我一直安慰自己乎赴,他們只是感情好忍法,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布潮尝。 她就那樣靜靜地躺著,像睡著了一般饿序。 火紅的嫁衣襯著肌膚如雪勉失。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天原探,我揣著相機(jī)與錄音乱凿,去河邊找鬼。 笑死咽弦,一個(gè)胖子當(dāng)著我的面吹牛徒蟆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播型型,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼段审,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了闹蒜?” 一聲冷哼從身側(cè)響起寺枉,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绷落,沒想到半個(gè)月后姥闪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砌烁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年筐喳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片函喉。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疏唾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出函似,到底是詐尸還是另有隱情,我是刑警寧澤喉童,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布撇寞,位于F島的核電站,受9級(jí)特大地震影響堂氯,放射性物質(zhì)發(fā)生泄漏蔑担。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一咽白、第九天 我趴在偏房一處隱蔽的房頂上張望啤握。 院中可真熱鬧,春花似錦晶框、人聲如沸排抬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹲蒲。三九已至番甩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間届搁,已是汗流浹背缘薛。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卡睦,地道東北人宴胧。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像表锻,于是被迫代替她去往敵國和親恕齐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容