Android圖形系統(tǒng)(八)-app與SurfaceFlinger共享UI元數(shù)據(jù)過程

Android應用程序與SurfaceFlinger服務是運行在不同的進程中的胡桨,因此瞬雹,它們采用Binder進程間通信機制來進行通信昧谊。

但是我們知道一個Android應用程序可能會有很多個窗口,而每一個窗口都有自己的UI元數(shù)據(jù)酗捌,因此呢诬,Android應用程序需要傳遞給SurfaceFlinger服務的UI元數(shù)據(jù)是相當可觀的。在這種情況下膛虫,通過Binder來在Android應用程序與SurfaceFlinger服務之間傳遞UI元數(shù)據(jù)是不合適的钓猬,因此這里選擇了Android系統(tǒng)的匿名共享內存的方案撩独。在每一個Android應用程序與SurfaceFlinger服務之間的連接上加上一塊用來傳遞UI元數(shù)據(jù)的匿名共享內存。而這塊區(qū)域被包裝為SharedClient综膀。

在每一個SharedClient里面,有至多31個SharedBufferStack,那什么又是SharedBufferStack橄登?

SharedBufferStack就是共享緩沖區(qū)堆棧讥此,每一個SharedBufferStack與一個Surface一一對應拢锹,每一個Surface又對應一個窗口萄喳,那就是一個應用程序內部最多可創(chuàng)建31個窗口。SharedBufferStack 內部包含N個緩沖buffer, 開篇介紹的雙緩沖(front buffer , back buffer) ,三緩沖(front buffer , back buffer, tripple buffer)充坑,有了它SurfaceFlinger服務就可以使用N個緩沖區(qū)技術來繪制UI了染突。

下面我們再來了解下SharedBufferStack的結構:

SharedBufferStack中分為空閑buffer和已使用的buffer。其中SharedBufferStack中的每一個已經(jīng)使用了的緩沖區(qū)都對應有一個GraphicBuffer也榄,用來描述真正的UI數(shù)據(jù)薪棒。

客戶端一次申請GraphicBuffer且將UI元數(shù)據(jù)寫入GraphicBuffer的流程:

當Android應用程序需要更新一個Surface的時候,它就會找到與它所對應的SharedBufferStack俐芯,并且從它的空閑緩沖區(qū)列表的尾部取出一個空閑的Buffer。我們假設這個取出來的空閑Buffer的編號為index吧史。接下來Android應用程序就請求SurfaceFlinger服務為這個編號為index的Buffer分配一個圖形緩沖區(qū)GraphicBuffer。SurfaceFlinger服務分配好圖形緩沖區(qū)GraphicBuffer之后吨述,會將它的編號設置為index,然后再將這個圖形緩沖區(qū)GraphicBuffer返回給Android應用程序訪問揣云。Android應用程序得到了SurfaceFlinger服務返回的圖形緩沖區(qū)GraphicBuffer之后,就在里面寫入UI數(shù)據(jù)刘莹。寫完之后焚刚,就將與它所對應的緩沖區(qū)点弯,即編號為index的Buffer矿咕,插入到對應的SharedBufferStack的已經(jīng)使用了的緩沖區(qū)列表的頭部去。這一步完成了之后捡絮,Android應用程序就通知SurfaceFlinger服務去繪制那些保存在已經(jīng)使用了的緩沖區(qū)所描述的圖形緩沖區(qū)GraphicBuffer了。

那么我們也知道一個繪圖表面锦援,在SurfaceFlinger服務和Android應用程序中分別對應Layer對象和Surface對象剥悟,其中這兩個對象在內部分別使用一個SharedBufferServer對象和一個SharedBufferClient對象來操作這個繪圖表面的UI元數(shù)據(jù)緩沖堆棧。操作過程如下:

在Android應用程序這一側区岗,當它需要渲染一個Surface時,它就會首先找到對應的SharedBufferClient對象叮称,然后再調用它的成員函數(shù)dequeue來請求分配一個UI元數(shù)據(jù)緩沖區(qū)藐鹤。有了這個UI元數(shù)據(jù)緩沖區(qū)之后,Android應用程序再調用這個SharedBufferClient對象的成員函數(shù)setDirtyRegion娱节、setCrop和setTransform來設置對應的Surface的裁剪區(qū)域、紋理坐標以及旋轉方向肄满。此外质涛,Android應用程序還會請求SurfaceFlinger服務為這個Surface分配一個圖形緩沖區(qū)掰担,以便可以往這個圖形緩沖區(qū)寫入實際的UI數(shù)據(jù)。最后带饱,Android應用程序就可以調用這個SharedBufferClient對象的成員函數(shù)queue把前面已經(jīng)準備好了的UI元數(shù)據(jù)緩沖區(qū)加入到它所描述的一個UI元數(shù)據(jù)緩沖區(qū)堆棧的待渲染隊列中,以便SurfaceFlinger服務可以在合適的時候對它進行渲染月趟。當SurfaceFlinger服務需要渲染一個Surface的時候恢口,它就會找到對應的一個SharedBufferServer對象穷躁,然后調用它的成員函數(shù)getQueueCount來檢查它所描述的一個UI元數(shù)據(jù)緩沖區(qū)堆棧的待渲染隊列的大小。如果這個大小大于0问潭,那么SurfaceFlinger服務就會繼續(xù)調用它的成員函數(shù)retireAndLock來取出隊列中的第一個UI元數(shù)據(jù)緩沖區(qū),以及調用它的成員函數(shù)getDirtyRegion狡忙、getCrop和getTransform來獲得要渲染的Surface的裁剪區(qū)域、紋理坐標和旋轉方向窜觉。最后北专,SurfaceFlinger服務就可以結合這些信息來將保存這個Surface的圖形緩沖區(qū)中的UI數(shù)據(jù)渲染在顯示屏中。

另外想深入了解BufferQueue的生產(chǎn)者消費者模型拓颓,詳細可以閱讀下如下這篇博文,感覺還不錯:https://blog.csdn.net/stn_lcd/article/details/73801313

參考:
https://blog.csdn.net/Luoshengyang/article/details/7867340

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
禁止轉載砰左,如需轉載請通過簡信或評論聯(lián)系作者场航。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市酬核,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嫡意,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件此迅,死亡現(xiàn)場離奇詭異旧巾,居然都是意外死亡耸序,警方通過查閱死者的電腦和手機鲁猩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門廓握,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搅窿,“玉大人隙券,你說我怎么就攤上這事∮樽校” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵耐朴,是天一觀的道長恩溅。 經(jīng)常有香客問我,道長脚乡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任俯艰,我火速辦了婚禮锌订,結果婚禮上,老公的妹妹穿的比我還像新娘辆飘。我一直安慰自己谓传,他們只是感情好芹关,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侥衬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪直颅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天功偿,我揣著相機與錄音往堡,去河邊找鬼。 笑死投蝉,一個胖子當著我的面吹牛征堪,可吹牛的內容都是我干的。 我是一名探鬼主播佃蚜,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼谐算,長吁一口氣:“原來是場噩夢啊……” “哼熟尉!你這毒婦竟也來了洲脂?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤往果,失蹤者是張志新(化名)和其女友劉穎一铅,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體潘飘,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡掉缺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年戈擒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赘来。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡凯傲,死狀恐怖,靈堂內的尸體忽然破棺而出冰单,到底是詐尸還是另有隱情,我是刑警寧澤诫欠,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站轿偎,受9級特大地震影響被廓,放射性物質發(fā)生泄漏坏晦。R本人自食惡果不足惜嫁乘,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望仓蛆。 院中可真熱鬧,春花似錦看疙、人聲如沸直奋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至殉挽,卻和暖如春拓巧,著一層夾襖步出監(jiān)牢的瞬間一死,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工投慈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伪煤。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓抱既,卻偏偏與公主長得像职烧,于是被迫代替她去往敵國和親防泵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內容