亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1494 | 回復: 0
打印 上一主題 下一主題

Android GDI之SurfaceFlinger [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2011-12-22 08:51 |只看該作者 |倒序瀏覽
來自 http://blog.csdn.net/maxleng/article/details/5671271
Android GDI之SurfaceFlinger

SurfaceFinger按英文翻譯過來就是Surface投遞者。SufaceFlinger的構成并不是太復雜,復雜的是他的客戶端建構。SufaceFlinger主要功能是:

1) 將Layers (Surfaces) 內容的刷新到屏幕上

2) 維持Layer的Zorder序列,并對Layer最終輸出做出裁剪計算。

3) 響應Client要求,創(chuàng)建Layer與客戶端的Surface建立連接

4) 接收Client要求,修改Layer屬性(輸出大小,Alpha等設定)

但是作為投遞者的實際意義,我們首先需要知道的是如何投遞,投擲物,投遞路線,投遞目的地。

1  SurfaceFlinger的基本組成框架

image

SurfaceFlinger管理對象為:

mClientsMap:管理客戶端與服務端的連接。

ISurface,IsurfaceComposer:AIDL調用接口實例

mLayerMap:服務端的Surface的管理對象。

mCurrentState.layersSortedByZ :以Surface的Z-order序列排列的Layer數(shù)組。

graphicPlane 緩沖區(qū)輸出管理

OpenGL ES:圖形計算,圖像合成等圖形庫。

gralloc.xxx.so這是個跟平臺相關的圖形緩沖區(qū)管理器。

pmem Device:提供共享內存,在這里只是在gralloc.xxx.so可見,在上層被gralloc.xxx.so抽象了。

2 SurfaceFinger Client和服務端對象關系圖

image

Client端與SurfaceFlinger連接圖:

image 

Client對象:一般的在客戶端都是通過SurfaceComposerClient來跟SurfaceFlinger打交道。

image

image

3 主要對象說明 3.1 DisplayHardware &FrameBuffer

    首先SurfaceFlinger需要操作到屏幕,需要建立一個屏幕硬件緩沖區(qū)管理框架。Android在設計支持時,考慮多個屏幕的情況,引入了 graphicPlane的概念。在SurfaceFlinger上有一個graphicPlane數(shù)組,每一個graphicPlane對象都對應一個 DisplayHardware.在當前的Android(2.1)版本的設計中,系統(tǒng)支持一個graphicPlane,所以也就支持一個 DisplayHardware。

SurfaceFlinger,Hardware硬件緩沖區(qū)的數(shù)據(jù)結構關系圖。

image

3.2 Layer

image

method:setBuffer  在SurfaceFlinger端建立顯示緩沖區(qū)。這里的緩沖區(qū)是指的HW性質的,PMEM設備文件映射的內存。

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(確定輸出目標)

      初始化:OpenGL ES

           建立兼容的mainSurface.利用eglCreateWindowSurface。

           建立OpenGL ES進程上下文。

   建立主Surface(OpenGL ES)。 DisplayHardware的Init()@DisplayHardware.cpp函數(shù)對OpenGL做了初始化,并創(chuàng)建立主Surface。為什 么叫主Surface,因為所有的Layer在繪制時,都需要先繪制在這個主Surface上,最后系統(tǒng)才將主Surface的內容”投擲”到真正的屏幕 上。

(3) 主Surface的綁定

1)在DisplayHandware初始完畢后,hw.makeCurrent()將主Surface,OpenGL ES進程上下文綁定到SurfaceFlinger的上下文中,

2)之后所有的SurfaceFlinger進程中使用EGL的所有的操作目的地都是mSurface@DisplayHardware

這樣,在OpenGL繪制圖形時,主Surface被記錄在進程的上下文中,所以看不到顯示的主Surfce相關參數(shù)的傳遞。下面是Layer-Draw,Hardware.flip的動作示意圖:

image

4.2 ThreadLoop

image

(1)handleTransaction(…):主要計算每個Layer有無屬性修改,如果有修改著內用需要重畫。

(2)handlePageFlip()

    computeVisibleRegions:根據(jù)Z-Order序列計算每個Layer的可見區(qū)域和被覆蓋區(qū)域。裁剪輸出范圍計算-

在生成裁剪區(qū)域的時候,根據(jù)Z_order依次,每個Layer在計算自己在屏幕的可顯示區(qū)域時,需要經歷如下步驟:

  1)以自己的W,H給出自己初始的可見區(qū)域

  2)減去自己上面窗口所覆蓋的區(qū)域

image

在繪制時,Layer將根據(jù)自己的可將區(qū)域做相應的區(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 總結

現(xiàn)在SurfaceFlinger干的事情利用下面的示意圖表示出來:

image

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP