<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ### Android GDI之SurfaceFlinger SurfaceFinger按英文翻譯過來就是Surface投遞者。SufaceFlinger的構成并不是太復雜,復雜的是他的客戶端建構。SufaceFlinger主要功能是: 1) 將Layers (Surfaces) 內容的刷新到屏幕上 2) 維持Layer的Zorder序列,并對Layer最終輸出做出裁剪計算。 3) 響應Client要求,創建Layer與客戶端的Surface建立連接 4) 接收Client要求,修改Layer屬性(輸出大小,Alpha等設定) 但是作為投遞者的實際意義,我們首先需要知道的是如何投遞,投擲物,投遞路線,投遞目的地。 ### 1? SurfaceFlinger的基本組成框架 [![image](https://box.kancloud.cn/2016-05-05_572b1a2a8abcb.gif "image") ](http://hi.csdn.net/attachment/201006/14/0_1276518584xvSo.gif) SurfaceFlinger管理對象為: mClientsMap:管理客戶端與服務端的連接。 ISurface,IsurfaceComposer:AIDL調用接口實例 mLayerMap:服務端的Surface的管理對象。 mCurrentState.layersSortedByZ :以Surface的Z-order序列排列的Layer數組。 graphicPlane 緩沖區輸出管理 OpenGL ES:圖形計算,圖像合成等圖形庫。 gralloc.xxx.so這是個跟平臺相關的圖形緩沖區管理器。 pmem Device:提供共享內存,在這里只是在gralloc.xxx.so可見,在上層被gralloc.xxx.so抽象了。 ### 2 SurfaceFinger Client和服務端對象關系圖 [[![image](https://box.kancloud.cn/2016-05-05_572b1a2aa243c.gif "image")](http://hi.csdn.net/attachment/201006/14/0_12765192776tBE.gif)](http://hi.csdn.net/attachment/201006/14/0_12765192744dUQ.gif) Client端與SurfaceFlinger連接圖: [![image](https://box.kancloud.cn/2016-05-05_572b1a2b32428.gif "image") ](http://hi.csdn.net/attachment/201006/14/0_1276518598A6OZ.gif)? Client對象:一般的在客戶端都是通過SurfaceComposerClient來跟SurfaceFlinger打交道。 [![image](https://box.kancloud.cn/2016-05-05_572b1a2b44483.gif "image") ](http://hi.csdn.net/attachment/201006/14/0_1276518601fTft.gif) [![image](https://box.kancloud.cn/2016-05-05_572b1a2b5b4e7.gif "image") ](http://hi.csdn.net/attachment/201006/14/0_1276518603bAHB.gif) ### 3 主要對象說明 #### 3.1 DisplayHardware &FrameBuffer 首先SurfaceFlinger需要操作到屏幕,需要建立一個屏幕硬件緩沖區管理框架。Android在設計支持時,考慮多個屏幕的情況,引入了graphicPlane的概念。在SurfaceFlinger上有一個graphicPlane數組,每一個graphicPlane對象都對應一個DisplayHardware.在當前的Android(2.1)版本的設計中,系統支持一個graphicPlane,所以也就支持一個DisplayHardware。 SurfaceFlinger,Hardware硬件緩沖區的數據結構關系圖。 [![image](https://box.kancloud.cn/2016-05-05_572b1a2b713b8.gif "image") ](http://hi.csdn.net/attachment/201006/14/0_1276518606owJM.gif) #### 3.2 Layer [![image](https://box.kancloud.cn/2016-05-05_572b1a2b89104.gif "image") ](http://hi.csdn.net/attachment/201006/14/0_1276518608eft1.gif) method:setBuffer? 在SurfaceFlinger端建立顯示緩沖區。這里的緩沖區是指的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數組,該數組是層顯示遮擋的依據。在每個層計算自己的可見區域時,從Z-order 頂層開始計算,是考慮到遮擋區域的裁減,自己之前層的可見區域就是自己的不可見區域。而繪制Layer時,則從Z-order底層開始繪制,這個考慮到透明層的疊加。 ### 4 SurfaceFlinger的運行框架 我們從前面的章節<Android Service>的基本原理可以知道,SurfaceFlinger的運行框架存在于:threadLoop,他是SurfaceFlinger的主循環體。SurfaceFlinger在進入主體循環之前會首先運行:SurfaceFlinger::readyToRun()。 #### 4.1 SurfaceFlinger::readyToRun() (1)建立GraphicPanle (2)建立FrameBufferHardware(確定輸出目標) 初始化:OpenGL ES 建立兼容的mainSurface.利用eglCreateWindowSurface。 建立OpenGL ES進程上下文。 建立主Surface(OpenGL ES)。 DisplayHardware的Init()@DisplayHardware.cpp函數對OpenGL做了初始化,并創建立主Surface。為什么叫主Surface,因為所有的Layer在繪制時,都需要先繪制在這個主Surface上,最后系統才將主Surface的內容”投擲”到真正的屏幕上。 (3) 主Surface的綁定 1)在DisplayHandware初始完畢后,hw.makeCurrent()將主Surface,OpenGL ES進程上下文綁定到SurfaceFlinger的上下文中, 2)之后所有的SurfaceFlinger進程中使用EGL的所有的操作目的地都是[mSurface@DisplayHardware](#)。 這樣,在OpenGL繪制圖形時,主Surface被記錄在進程的上下文中,所以看不到顯示的主Surfce相關參數的傳遞。下面是Layer-Draw,Hardware.flip的動作示意圖: [![image](https://box.kancloud.cn/2016-05-05_572b1a2b9bc43.gif "image") ](http://hi.csdn.net/attachment/201006/14/0_1276518609tWF6.gif) #### 4.2 ThreadLoop [![image](https://box.kancloud.cn/2016-05-05_572b1a2bb19a5.gif "image") ](http://hi.csdn.net/attachment/201006/14/0_12765186106SH3.gif) (1)handleTransaction(…):主要計算每個Layer有無屬性修改,如果有修改著內用需要重畫。 (2)handlePageFlip() computeVisibleRegions:根據Z-Order序列計算每個Layer的可見區域和被覆蓋區域。裁剪輸出范圍計算- 在生成裁剪區域的時候,根據Z_order依次,每個Layer在計算自己在屏幕的可顯示區域時,需要經歷如下步驟: 1)以自己的W,H給出自己初始的可見區域 2)減去自己上面窗口所覆蓋的區域 [![image](https://box.kancloud.cn/2016-05-05_572b1a2bc3d8d.gif "image") ](http://hi.csdn.net/attachment/201006/14/0_1276518612eyG3.gif) 在繪制時,Layer將根據自己的可將區域做相應的區域數據Copy。 (3)handleRepaint() composeSurfaces(需要刷新區域): 根據每個Layer的可見區域與需要刷新區域的交集區域從Z-Order序列從底部開始繪制到主Surface上。 (4)postFramebuffer() (DisplayHardware)hw.flip(mInvalidRegion); eglSwapBuffers(display,mSurface) :將mSruface投遞到屏幕。 ### 5 總結 現在SurfaceFlinger干的事情利用下面的示意圖表示出來: [![image](https://box.kancloud.cn/2016-05-05_572b1a2bd7cb1.gif "image") ](http://hi.csdn.net/attachment/201006/14/0_1276518615Bgfw.gif)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看