簡單梳理Android Surface原理(基於O)

[Android Framework] 簡單梳理Android Surface原理(基於O))

一. Surface概述

https://www.cnblogs.com/Sharley/p/5600314.html
Surface對應了一塊屏幕緩衝區,每個window對應一個Surface,任何View都要畫在Surface的Canvas上
Surface中有一個Canvas成員,專門用於畫圖的。
Surface是用來管理數據的。(句柄)
準確來說應該是一個數據容器交由生產者往surface申請對應的GraphicBuffer中填數據,交由consumer消費,consumer不僅只是surfaceflinger;

二.Surface使用的場景

1. Activity界面顯示

在這裏插入圖片描述
主要步驟:

  1. activity創建時會給Activity創建一個對應的PhoneWindow,而該PhoneWindow中會創建一個DecorView,即一個Activity對應一個PhoneWindow,對應一個DecorView;
  2. Activity生命週期onCreate中調用setContentView(int ResourceID)方法實際調用到了PhoneWindow的該方法,將調用LayoutInflater的inflater方法將佈局文件中的View創建出來加入到PhoneWindow的DercorView中;
  3. 創建viewRootImpl將DercorView中的內容數據填充到自身的成員變量Surface中
    該Surface實質上是一個數據載體,最終通過WindowsManagerService傳遞給SurfaceFLinger去顯示,準確的說應該是Surface通過BufferQueue的機制,使得App與Surfaceflinger分別成爲生產者和消費者去處理Surface中的數據。

ViewRoot中的surface通過WMS與SurfaceFlinger中的BufferLayer進行關聯:
在這裏插入圖片描述
通過如上過程,知道一點,ViewRootImpl中的mSurface對應着SurfaceFlinger中的一個BufferLayer;
以drawSoftware方法來看(新版本Android已經不走該方法,通過RenderThread去繪製,下次學習完再做整理):
在這裏插入圖片描述
繪製的時候會去dequeuebuffer,生產數據完畢後在queueBuffer,之後SurfaceFlinger會拿到buffer數據進行顯示。

綜上來看,App進程作爲Activity對應的ViewRootImpl中的mSurface的生產者,根據View的改變不斷的在mSurface中填充View數據,mSurface通過WindowManagerService進程與SurfaceFlinger中的BufferLayer一一對應,SurfaceFliner作爲該mSurface的消費者,將數據合成並交由硬件顯示出來。

該例子中的BufferQueue由SurfaceFlinger進行管理。

2. SurfaceView

SurfaceView本身持有一個Surface對象,它的特點是:
A. 具有獨立的繪圖表面;
B. 需要在宿主窗口上挖一個洞來顯示自己;
C. 它的UI繪製可以在獨立的線程中進行,這樣就可以進行復雜的UI繪製,並且不會影響應用程序的主線程響應用戶輸入。
原理可以參考學習:
https://blog.csdn.net/suhaiqiangxue/article/details/52932147
https://blog.csdn.net/luoshengyang/article/details/8661317/

如果layout中有SurfaceView:
在這裏插入圖片描述
從上面圖看來,SurfaceView中的mSurface也會通過WMS與SurfaceFlinger中的Bufferlayer進行關聯,及如果一個window中有SurfaceView控件,PhoneWindow本身會有一個mSurface對應SurfaceFlinger中的一個Bufferlayer,SurfaceView中的mSurface也會對應Surfaceflinger中的一個Bufferlayer,及SurfaceFlinger爲該界面維護者兩個BufferQueue。
大致情況如下:
在這裏插入圖片描述

3. 相機中的Surface

相機preview與takepicture都使用到Surface去作爲生產或消費的數據載體,相機的細節流程這裏不討論,下次專門整理下,大概流程如下:
在這裏插入圖片描述
1.相機打開之後會傳兩個Surface到CameraServer,一個Surface是用來作爲Preview的數據載體,另一個用作拍照時保存圖片的數據載體。一般preview的Surface由TextureView或GLSurfaceView關聯的SurfaceTexture來提供,保存圖片的Surface由ImageReader來提供;
2.Surface會在CameraServer進程中包裝創建出流,即一個Surface對應着一個OutputStream,用於HAL層將數據填充回來,當然這裏HAL層就相當與該Surface的生產者,而上層的GLSurfaceView和ImageReader相當與Surface的消費者(分別將Surface中的數據預覽顯示出來和保存成圖片消費掉);
3. CameraServer中初始化時會起個RequestThread,不斷循環等待處理的request:
在這裏插入圖片描述
這裏看出HAL層實際上是Surface的生產者。
而Surface的消費者正是Camera應用中的預覽使用的TextureView或GLSurfaceView,與保存圖片的ImageReader:

  1. Preview:
    在這裏插入圖片描述
    GLSurfaceView中需要創建SurfaceTexture來使用(TextureView自帶一個SurfaceTexture)SurfaceTexture作爲preview的surface的消費者,交由GLConsumer消費成TextImage繪製到對應的GLSurfaceView的mSurface上;這裏的BufferQueue由應用進程分配管理;

GLSurfaceView本質上也是個SurfaceView,在上面提到的SurfaceView的mSurface與SurfaceFlinger中的BufferLayer相關連,因此此時GLSurfaceView與SurfaceFlinger又維持着一個BufferQueue的生產者與消費者的關係,與上一段中的提到的BufferQueue不是一個,mSurface中的內容最終交給SurfaceFlinger去合成顯示。

  1. takePicture:
    在這裏插入圖片描述
    Camera應用作爲拍照Surface的消費者將Surface中的數據消費生產出圖片進行保存。這裏的BufferQueue由應用進程分配管理;

三. 總結

Surface一般作爲GraphicBuffer數據載體,提給給生產者和消費者進行數據的填充和獲取。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章