目錄
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顯示步氏。
- 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 是雙緩沖. - SurfaceTexture和TextTexture都是把內(nèi)容流上的圖像轉(zhuǎn)成紋理隆嗅,然后輸出.
SurfaceTexture是buffer.SurfaceTexture 綁定surface.SurfaceTexture 是jave view 層,surface 是 native層界阁。
TextTexture=SurfaceView+SurfaceTexture。SurfaceView在主線程胖喳,SurfaceTexture在渲染線程 - Glsurfaceview,egl, render,opengl 泡躯,drawer,關(guān)系丽焊?
GLsurfaceview=surfaceview+surfaceTexture+Opengl+egl较剃。直接使用最上層即可.
數(shù)據(jù)流:Glsurfaceview.setRender->render.ondrawFrame(display)->opengl->eglsurfaceC->屏幕Glsurfaceview. -
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
- 表面(Surface): Surface就是指向顯存的一個物體写穴,用來被繪制到屏幕上,所有你能看見的Window都擁有可以在上面繪制的Surface,在安卓中雌贱,系統(tǒng)使用Surface Flinger服務(wù)來把Surface按照正確的深度信息渲染到最終的屏幕上.Surface通常在back buffer中進行渲染啊送,完成之后與front buffer交換,這樣顯示到屏幕上,以實現(xiàn)流暢顯示的效果.
- 窗口(Window): 一個application通過Windows Manager來創(chuàng)建窗口欣孤,Windows Manager為每一個窗口(windows)創(chuàng)建Surface來讓application在上面繪制各種物體馋没。
- 視圖(View):視圖就窗口里的UI元素,一個窗口只擁有一個View Hierarchy,這些View Hierarchy提供了窗口里的所有表現(xiàn)降传。當一個窗口需要重新繪制時(比如一個View invalidate自己)篷朵,鎖定Surface,并返回一個Canvas用來在上面繪制婆排,如上圖所示声旺,在view hierarchy樹向下傳遞Canvas控硼,來繪制每個view。這一切都完成后艾少,Surface被解鎖,并通過Surface Flinger交換前后Buffer來顯示到屏幕上翼悴。
- Canvas:Canvas是Surface繪圖時返回的一個接口缚够,并提供一些繪圖api,用來進行實際的繪圖操作。目前Canvas可以繪制在bitmap或者openGL container上鹦赎。
- 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.
- camera etc采集
- 圖像流通過Surface入隊到BufferQueue,并通知到GLConsumer鲸阻。
- GLConsumer從BufferQueue獲取圖像流GraphicBuffer跋涣,并轉(zhuǎn)換為Opengl紋理(updateTexImage)。
- Opengl filter 渲染(上特效) (option)
-
數(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
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)容較好:
- 上文中的uml圖和時序圖很好,將類的結(jié)合友浸,類的框架畫的很清楚峰尝。
- surfaceview的底層實現(xiàn)是bufferqueue.時序圖說明了消息流程.
- 說明了java-jni-native
- 說明了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é)不適合分析