国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Android核心分析(26)-----Android GDI之SurfaceFlinger
Android GDI之SurfaceFlinger
SurfaceFinger按英文翻譯過來就是Surface投遞者。SufaceFlinger的構(gòu)成并不是太復(fù)雜,復(fù)雜的是他的客戶端建構(gòu)。SufaceFlinger主要功能是:
1) 將Layers (Surfaces) 內(nèi)容的刷新到屏幕上
2) 維持Layer的Zorder序列,并對Layer最終輸出做出裁剪計算。
3) 響應(yīng)Client要求,創(chuàng)建Layer與客戶端的Surface建立連接
4) 接收Client要求,修改Layer屬性(輸出大小,Alpha等設(shè)定)
但是作為投遞者的實際意義,我們首先需要知道的是如何投遞,投擲物,投遞路線,投遞目的地。
1  SurfaceFlinger的基本組成框架
 
SurfaceFlinger管理對象為:
mClientsMap:管理客戶端與服務(wù)端的連接。
ISurface,IsurfaceComposer:AIDL調(diào)用接口實例
mLayerMap:服務(wù)端的Surface的管理對象。
mCurrentState.layersSortedByZ :以Surface的Z-order序列排列的Layer數(shù)組。
graphicPlane 緩沖區(qū)輸出管理
OpenGL ES:圖形計算,圖像合成等圖形庫。
gralloc.xxx.so這是個跟平臺相關(guān)的圖形緩沖區(qū)管理器。
pmem Device:提供共享內(nèi)存,在這里只是在gralloc.xxx.so可見,在上層被gralloc.xxx.so抽象了。
2 SurfaceFinger Client和服務(wù)端對象關(guān)系圖
 
Client端與SurfaceFlinger連接圖:
 
Client對象:一般的在客戶端都是通過SurfaceComposerClient來跟SurfaceFlinger打交道。
 

 
3 主要對象說明
3.1 DisplayHardware &FrameBuffer
    首先SurfaceFlinger需要操作到屏幕,需要建立一個屏幕硬件緩沖區(qū)管理框架。Android在設(shè)計支持時,考慮多個屏幕的情況,引入了graphicPlane的概念。在SurfaceFlinger上有一個graphicPlane數(shù)組,每一個graphicPlane對象都對應(yīng)一個DisplayHardware.在當(dāng)前的Android(2.1)版本的設(shè)計中,系統(tǒng)支持一個graphicPlane,所以也就支持一個DisplayHardware。
SurfaceFlinger,Hardware硬件緩沖區(qū)的數(shù)據(jù)結(jié)構(gòu)關(guān)系圖。


3.2 Layer
 
method:setBuffer  在SurfaceFlinger端建立顯示緩沖區(qū)。這里的緩沖區(qū)是指的HW性質(zhì)的,PMEM設(shè)備文件映射的內(nèi)存。
1) layer的繪制
void Layer::onDraw(const Region& clip) const
{
    int index = mFrontBufferIndex;
    GLuint textureName = mTextures[index].name;
  drawWithOpenGL(clip, mTextures[index]);
}
3.2 mCurrentState.layersSortedByZ
   以Surface的Z-order序列排列的LayerBase數(shù)組,該數(shù)組是層顯示遮擋的依據(jù)。在每個層計算自己的可見區(qū)域時,從Z-order 頂層開始計算,是考慮到遮擋區(qū)域的裁減,自己之前層的可見區(qū)域就是自己的不可見區(qū)域。而繪制Layer時,則從Z-order底層開始繪制,這個考慮到透明層的疊加。

4 SurfaceFlinger的運行框架
    我們從前面的章節(jié)<Android Service>的基本原理可以知道,SurfaceFlinger的運行框架存在于:threadLoop,他是SurfaceFlinger的主循環(huán)體。SurfaceFlinger在進入主體循環(huán)之前會首先運行:SurfaceFlinger::readyToRun()。
4.1 SurfaceFlinger::readyToRun()
(1)建立GraphicPanle
(2)建立FrameBufferHardware(確定輸出目標(biāo))
      初始化:OpenGL ES
           建立兼容的mainSurface.利用eglCreateWindowSurface。
           建立OpenGL ES進程上下文。
   建立主Surface(OpenGL ES)。 DisplayHardware的Init()@DisplayHardware.cpp函數(shù)對OpenGL做了初始化,并創(chuàng)建立主Surface。為什么叫主Surface,因為所有的Layer在繪制時,都需要先繪制在這個主Surface上,最后系統(tǒng)才將主Surface的內(nèi)容”投擲”到真正的屏幕上。
(3) 主Surface的綁定
1)在DisplayHandware初始完畢后,hw.makeCurrent()將主Surface,OpenGL ES進程上下文綁定到SurfaceFlinger的上下文中,
2)之后所有的SurfaceFlinger進程中使用EGL的所有的操作目的地都是mSurface@DisplayHardware。
這樣,在OpenGL繪制圖形時,主Surface被記錄在進程的上下文中,所以看不到顯示的主Surfce相關(guān)參數(shù)的傳遞。下面是Layer-Draw,Hardware.flip的動作示意圖:
 
4.2 ThreadLoop
 
(1)handleTransaction(…):主要計算每個Layer有無屬性修改,如果有修改著內(nèi)用需要重畫。
(2)handlePageFlip()
    computeVisibleRegions:根據(jù)Z-Order序列計算每個Layer的可見區(qū)域和被覆蓋區(qū)域。裁剪輸出范圍計算-
在生成裁剪區(qū)域的時候,根據(jù)Z_order依次,每個Layer在計算自己在屏幕的可顯示區(qū)域時,需要經(jīng)歷如下步驟:
  1)以自己的W,H給出自己初始的可見區(qū)域
  2)減去自己上面窗口所覆蓋的區(qū)域
 
在繪制時,Layer將根據(jù)自己的可將區(qū)域做相應(yīng)的區(qū)域數(shù)據(jù)Copy。
(3)handleRepaint()
composeSurfaces(需要刷新區(qū)域):
根據(jù)每個Layer的可見區(qū)域與需要刷新區(qū)域的交集區(qū)域從Z-Order序列從底部開始繪制到主Surface上。
(4)postFramebuffer()
(DisplayHardware)hw.flip(mInvalidRegion);
eglSwapBuffers(display,mSurface) :將mSruface投遞到屏幕。
5 總結(jié)
現(xiàn)在SurfaceFlinger干的事情利用下面的示意圖表示出來:
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Android
GUI系統(tǒng)之SurfaceFlinger(1)OpenGLES與EGL
Android系統(tǒng)Surface機制的SurfaceFlinger服務(wù)對幀緩沖區(qū)(Frame Buffer)的管理分析
Android Display System --- Surface Flinger
android豎屏顯示
【轉(zhuǎn)】Android display架構(gòu)分析
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服