一文了解surface,surfaceview,surfaceTexture,GLsurfaceView

目錄

1 基礎(chǔ)知識

2 surface使用

3 surfaceTexture使用

4 surfaceTexture 結(jié)構(gòu)分析

5 surfaceTexture 源碼分析

6 SurfaceFlinger

7 QA

8 參考與附錄

正文

一##. 概述
Android系統(tǒng)中圖形系統(tǒng)是相當復(fù)雜的,包括WindowManager慌盯,SurfaceFlinger,Open GL,GPU等模塊团赁。 其中SurfaceFlinger作為負責繪制應(yīng)用UI的核心囊嘉,從名字可以看出其功能是將所有Surface合成工作。 不論使用什么渲染API, 所有的東西最終都是渲染到”surface”. surface代表BufferQueue的生產(chǎn)者端, 并且 由SurfaceFlinger所消費,這便是基本的生產(chǎn)者-消費者模式. Android平臺所創(chuàng)建的Window都由surface所支持,所有可見的surface渲染到顯示設(shè)備都是通過SurfaceFlinger來完成的.

Android畫圖兩個模塊笛求,opengl和surface(buffer)廊移。

1 基礎(chǔ)知識

1) 畫家:程序員.參數(shù)gl=手.畫布:TexureView。OpenGL ES(render):畫筆探入。SurfaceTexture:作品狡孔。Surface: 畫紙。Graphic Buffer:畫板新症。SurfaceFlinger顯示步氏。

  1. Surface、SurfaceView和SurfaceHolder 搞清楚這3個核心概念就搞懂了surface
    surface是buffer.surface==eglsurface=framebuffer;
    surfaceview是view.它是xml中的config,不到它的存在.是屏幕顯示size即surface中的圖片的顯示大小.可以說surfaceview是surface的前端.
    surfaceholder=surface徒爹,實際是surface的listener荚醒。任何surface變化都會調(diào)用surfaceholder。surface consumer 是雙緩沖.
  2. SurfaceTexture和TextTexture都是把內(nèi)容流上的圖像轉(zhuǎn)成紋理隆嗅,然后輸出.
    SurfaceTexture是buffer.SurfaceTexture 綁定surface.SurfaceTexture 是jave view 層,surface 是 native層界阁。
    TextTexture=SurfaceView+SurfaceTexture。SurfaceView在主線程胖喳,SurfaceTexture在渲染線程
  3. Glsurfaceview,egl, render,opengl 泡躯,drawer,關(guān)系丽焊?
    GLsurfaceview=surfaceview+surfaceTexture+Opengl+egl较剃。直接使用最上層即可.
    數(shù)據(jù)流:Glsurfaceview.setRender->render.ondrawFrame(display)->opengl->eglsurfaceC->屏幕Glsurfaceview.
  4. Egl,Surface,Opengl什么關(guān)系
    egl=context+surface+display. egl因為被封裝在GLsurfaceview中,所以應(yīng)用層看不到它的存在.
    context可以綁定多個surface技健,實現(xiàn)share context(eg:綁定codec surface和屏幕surface consumer).
    surface->display:雙緩沖.swapbuffer將backbuffer 上的filter渲染發(fā)送到frontbuffer 即display


    image

2 surface使用

scenario1: surface與camera:采集callback:調(diào)用setOnFrameAvailableListener()函數(shù)將VideoDumpRenderer(實現(xiàn)SurfaceTexture.OnFrameAvailableListener接口)作為SurfaceTexture的Listener.
scenario2: surface與filter: 一個surface一個filter texture


image

image
  1. 表面(Surface): Surface就是指向顯存的一個物體写穴,用來被繪制到屏幕上,所有你能看見的Window都擁有可以在上面繪制的Surface,在安卓中雌贱,系統(tǒng)使用Surface Flinger服務(wù)來把Surface按照正確的深度信息渲染到最終的屏幕上.Surface通常在back buffer中進行渲染啊送,完成之后與front buffer交換,這樣顯示到屏幕上,以實現(xiàn)流暢顯示的效果.
  2. 窗口(Window): 一個application通過Windows Manager來創(chuàng)建窗口欣孤,Windows Manager為每一個窗口(windows)創(chuàng)建Surface來讓application在上面繪制各種物體馋没。
  3. 視圖(View):視圖就窗口里的UI元素,一個窗口只擁有一個View Hierarchy,這些View Hierarchy提供了窗口里的所有表現(xiàn)降传。當一個窗口需要重新繪制時(比如一個View invalidate自己)篷朵,鎖定Surface,并返回一個Canvas用來在上面繪制婆排,如上圖所示声旺,在view hierarchy樹向下傳遞Canvas控硼,來繪制每個view。這一切都完成后艾少,Surface被解鎖,并通過Surface Flinger交換前后Buffer來顯示到屏幕上翼悴。
  4. Canvas:Canvas是Surface繪圖時返回的一個接口缚够,并提供一些繪圖api,用來進行實際的繪圖操作。目前Canvas可以繪制在bitmap或者openGL container上鹦赎。
  5. SurfaceView: 它是View的一個特殊子類谍椅,它擁有專有的Surface,使application可以直接在上面繪制(普通的view hierarchy必須共享窗口唯一的surface)古话。
    原理是surfaceview請求Window Manager創(chuàng)建一個新窗口雏吭,并改變窗口之間的深度信息來顯示。如果SurfaceView的Window顯示在主窗口的后面陪踩,surfaceview將主窗口相應(yīng)的位置設(shè)置成透明來使可見杖们。
    總結(jié)一下,一個activity擁有一個window(用來繪制它的UI)-->一個Window只有一個Surface&View hierarchy來繪制=SurfaceView實質(zhì)上是創(chuàng)建了一個新的窗口肩狂,所以擁有自己獨立的Surface摘完,可以直接繪制在上面。

surfaceView:

雖然在App端它仍在View hierachy中傻谁,但在Server端(WMS和SF)中孝治,它與宿主窗口是分離的。這樣的好處是對這個Surface的渲染可以放到單獨線程去做审磁,渲染時可以有自己的GL context谈飒。這對于一些游戲、視頻等性能相關(guān)的應(yīng)用非常有益态蒂,因為它不會影響主線程對事件的響應(yīng)杭措。但它也有缺點,因為這個Surface不在View hierachy中吃媒,它的顯示也不受View的屬性控制瓤介,所以不能進行平移,縮放等變換赘那,也不能放在其它ViewGroup中刑桑,一些View中的特性也無法使用
Textureview和surfaceTexture連用,彌補了surfaceview的不足募舟。但是比surfaceview慢

3 surfaceTexture使用

與opengl連用


這里寫圖片描述

4 surfaceTexture 設(shè)計

surfaceTexture 是什么祠斧?
surfaceTexture是buffer .但是,它又不是簡單的一個buffer,而是由兩個buffer queue組成 .
下面這個整體結(jié)構(gòu)圖給力拱礁。把數(shù)據(jù)流向琢锋,輸入輸出辕漂,模塊組成和作用說的很清楚. 但是,仍然容易理解錯誤.
實際surfaceTexture=surface+一個queue, product 和consumer是兩個線程,兩個線程操作同一個queue.
數(shù)據(jù)流程:camera-->surfaceTexture'surface-->surfaceTexture's queue-->opengl Texture buffer-->native surface-->surfaceFinger-->eglsurface-->framebuffer
-->surfaceview/Textureview/Mediacodec
注意surfaceTexture的surface是給camera等采集端的吴超,native的surface是給輸出端的钉嘹。它們是兩個不同的surface.


image
  1. camera etc采集
  2. 圖像流通過Surface入隊到BufferQueue,并通知到GLConsumer鲸阻。
  3. GLConsumer從BufferQueue獲取圖像流GraphicBuffer跋涣,并轉(zhuǎn)換為Opengl紋理(updateTexImage)。
  4. Opengl filter 渲染(上特效) (option)
  5. 數(shù)據(jù)輸出到GLsurfaceview 和Mediacode (sharecontext技術(shù))


    image

    surfaceTexture=surfaceTexture product +surfaceTexture consumer queue+中間控制.
    不同于一個buffer,只有生產(chǎn)者鸟悴,消費者陈辱。它有生產(chǎn)者,中間商和消費者细诸。
    SurfaceTexture核心是BufferQueue.

5 SurfaceFlinger

[https://blog.csdn.net/fdsafwagdagadg6576/article/details/116352477]

6 SurfaceTexture源碼分析

示意圖說明: 左邊:主線程GLSurfaceView,使用渲染線程GLRender沛贪,GLRender使用主線程surface。右邊surfaceholder和左邊surface是一個震贵。左邊是新用法利赋,右邊是過去用法.
Surface實例分析: 參見:Android音視頻(六) 使用OpenGL ES 3.0預(yù)覽Camera https://juejin.cn/post/6844903962248740871
Android圖形系統(tǒng)之SurfaceTexture http://www.zyiz.net/tech/detail-135826.html

image

image

QA:

surfaceTexture與opengl textureid buffer的關(guān)系.why 要texturebuffer,而不是直接在gpu上run qsurface呢猩系? GPU需要自己的內(nèi)存隐砸。
surfaceTexture update之后就可以讀下一張圖片product了,理解為上一張?zhí)幚硗?在consmer中蝙眶。
camera preview,codec季希,surfaceview的surface是同一個嗎?no. codec surface 單獨幽纷,camera preview is surfaceP,surfaceview的surface is surfaceviewC

參考:

1 Android 5.0(Lollipop)中的SurfaceTexture式塌,TextureView, SurfaceView和GLSurfaceView:[https://blog.csdn.net/jinzhuojun/article/details/44062175]
文章說明: 內(nèi)容較好:

  1. 上文中的uml圖和時序圖很好,將類的結(jié)合友浸,類的框架畫的很清楚峰尝。
  2. surfaceview的底層實現(xiàn)是bufferqueue.時序圖說明了消息流程.
  3. 說明了java-jni-native
  4. 說明了render線程.
    缺點:介紹過多,重點不突出收恢,沒有小結(jié).

附錄:

1) 此圖只是surfaceTexture內(nèi)部更詳細一步.(不需要掌握):


2) 下面blog更詳細到了框架源碼中的底層(不需要掌握):
Android圖形系統(tǒng)分析與移植--四武学、Surface Manager(Surface Flinger簡介):https://blog.csdn.net/louiswangbing/article/details/6606810
blog說明1、Surface manager架構(gòu)分析:camera->Surface manager Client端(filter)->Surface manager Server端(SurfaceFlinger:back buffer)->(eglswapbuffer)->front buffer ->Display. "3Surface Flinger的基本組成框架以下" 不需要看,過于詳細(Flinger內(nèi)部介紹&dispay還有一個硬件buffer(graphicplane->nativewindow->framenativewindow->hardware buffer).
bufferqueue的實現(xiàn):BufferQueue 學(xué)習總結(jié)(內(nèi)附動態(tài)圖)(https://blog.csdn.net/hexiaolong2009/article/details/99225637) 贊動圖
3 ) GUI顯示系統(tǒng)之SurfaceFlinger---章節(jié)目錄
https://blog.csdn.net/xuesen_lin/article/details/8954508
4) Android圖形系統(tǒng)之SurfaceTexture https://juejin.cn/post/6844904161645953038 -surfaceTexture 源碼實現(xiàn)
5 Android 5.0(Lollipop)中的SurfaceTexture伦意,TextureView, SurfaceView和GLSurfaceView
https://blog.csdn.net/jinzhuojun/article/details/44062175 介紹概念比較全火窒,類圖多但是沒有流程圖和代碼分析,所以理解不深入驮肉,適合總結(jié)不適合分析

如對您有幫助熏矿,請隨手點個贊,謝謝###

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市票编,隨后出現(xiàn)的幾起案子褪储,更是在濱河造成了極大的恐慌,老刑警劉巖慧域,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鲤竹,死亡現(xiàn)場離奇詭異,居然都是意外死亡昔榴,警方通過查閱死者的電腦和手機宛裕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來论泛,“玉大人,你說我怎么就攤上這事蛹屿∑ㄗ啵” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵错负,是天一觀的道長坟瓢。 經(jīng)常有香客問我,道長犹撒,這世上最難降的妖魔是什么折联? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮识颊,結(jié)果婚禮上诚镰,老公的妹妹穿的比我還像新娘。我一直安慰自己祥款,他們只是感情好清笨,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刃跛,像睡著了一般抠艾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上桨昙,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天检号,我揣著相機與錄音,去河邊找鬼蛙酪。 笑死齐苛,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的桂塞。 我是一名探鬼主播脸狸,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了炊甲?” 一聲冷哼從身側(cè)響起泥彤,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卿啡,沒想到半個月后吟吝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡颈娜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年剑逃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片官辽。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛹磺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出同仆,到底是詐尸還是另有隱情萤捆,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布俗批,位于F島的核電站俗或,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏岁忘。R本人自食惡果不足惜辛慰,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望干像。 院中可真熱鬧帅腌,春花似錦、人聲如沸麻汰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽什乙。三九已至挽封,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間臣镣,已是汗流浹背辅愿。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留忆某,地道東北人点待。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像弃舒,于是被迫代替她去往敵國和親癞埠。 傳聞我的和親對象是個殘疾皇子状原,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

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