乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Android 雙屏顯示分析

       老匹夫 2019-12-02

      雙屏異顯

      系統(tǒng)提供了Presentation類,可以實(shí)現(xiàn)在兩塊屏幕上同時(shí)顯示不同的內(nèi)容;Presentation是一個(gè)特殊的dialog,它的目的是顯示內(nèi)容到第二屏幕。

      image.png

      基本原理

      image.png

      1 獲得顯示設(shè)備信息:
      DisplayManagerService 啟動(dòng)后從SurfaceFlinger當(dāng)中獲取到系統(tǒng)默認(rèn)的Display 與HDMI display的信息。

      2 應(yīng)用程序端指定其應(yīng)用ContextImpl的Display。

      3 應(yīng)用程序獲得Surface和配置Surface,這個(gè)surface對(duì)應(yīng)于SurfaceFlinger中的Layer;

      WindowManagerService作為一個(gè)系統(tǒng)服務(wù),主要管理系統(tǒng)中所有的應(yīng)用的Window。在WMS中,每個(gè)Window都有一個(gè)對(duì)應(yīng)的WindowState對(duì)象。

      3.1 addWindow,該函數(shù)在WindowManagerService當(dāng)中,由WindowManagerImpl中的addView函數(shù)調(diào)用到,并且將Window所在的Display作為參數(shù)帶到WMS當(dāng)中。

      3.2在addWindow函數(shù),WMS首先找到窗口所在的Display,創(chuàng)建WindowState,然后將窗口加到Display中的Windowlist當(dāng)中。win.mToken.addWindow(win);

      3.3 WindowState,獲取對(duì)應(yīng)Display的layerstack將其放置在WindowStateAnimator當(dāng)中,并且將值設(shè)置到SurfaceFlinger當(dāng)中與之對(duì)應(yīng)的Layer中,告知SurfaceFlinger自己所在Display。mSurfaceControl.setLayerStack(mLayerStack);

      4 繪制Surface
      SurfaceFlinger作為Android在native層比較重要的一個(gè)系統(tǒng)服務(wù),主要作用是compose所有的layer,將其繪制輸出到顯示設(shè)備當(dāng)中,也就是物理Display當(dāng)中。
      SurfaceFlinger根據(jù)Layer當(dāng)中的layerStack成員,獲知需要將該Layer繪制到具體哪一個(gè)Display當(dāng)中。


      image.png

      SurfaceFlinger需要利用HWC, Compose 屬于每個(gè)Display的layer,并且將其輸出到具體的DisplayDivice當(dāng)中。


      image.png

      源碼分析

      1 新設(shè)備加入流程

      DisplayManagerService


      image.png

      LocalDisplayAdapter


      image.png

      當(dāng)驅(qū)動(dòng)層發(fā)現(xiàn)設(shè)備加入時(shí)會(huì)發(fā)出事件,framework檢測(cè)到這個(gè)事件會(huì)調(diào)用onHotplug;如果是connected,那么調(diào)用tryConnectDisplayLocked,創(chuàng)建LocalDisplayDevice并保存到mDevices,發(fā)送DISPLAY_DEVICE_ENVENT_CHANGED;

      image.png
      image.png

      最終會(huì)調(diào)用DisplayManagerService中的handleDisplayDeviceAddedLocked;


      image.png

      handleDisplayDeviceAddedLocked函數(shù)中添加邏輯設(shè)備;并且分配默認(rèn)的displayId和Layerstack

      2 異顯示流程

      2.1 在Presentation創(chuàng)建的時(shí)候關(guān)聯(lián)一個(gè)目標(biāo)設(shè)備,確定Presentation要顯示在那個(gè)設(shè)備上。根據(jù)這個(gè)設(shè)備的信息來(lái)配置Presentation的context和resources信息,每一個(gè)display擁有自己的管理對(duì)象以及context對(duì)象,這樣雙屏的操作互相獨(dú)立;對(duì)于上層而言,其即意味著一個(gè)屏幕。


      image.png

      2.2 調(diào)用show函數(shù)顯示view;實(shí)際調(diào)用WindowManagerImpl的addview函數(shù);


      image.png

      WindowManagerImpl的addview 函數(shù)創(chuàng)建ViewRootImp,并調(diào)用ViewRootImpl的setView函數(shù);ViewRootImpl類中創(chuàng)建了WindowSession和IWindow對(duì)象負(fù)責(zé)和Windowmanagerservice之間跨進(jìn)程通信;
      image.png

      ViewRootImpl setview函數(shù),調(diào)用了requestLayout 和WindowSession addToDisplay;

      ViewRootImpl中requestLayout函數(shù)調(diào)用mWindowSession.relayout,最終調(diào)用WindowManagerservice 的relayoutWindow,這個(gè)函數(shù)會(huì)配置Display信息; WindowStateAnimator創(chuàng)建Surfacecontrol,通過(guò)SurfaceControl,設(shè)置Layerstack;


      image.png

      SurfaceControl 事務(wù)

      SurfaceControl開(kāi)始事務(wù),設(shè)置參數(shù),結(jié)束事務(wù)

      image.png

      WindowManagerservice addWindow函數(shù)

      1 通過(guò)displayId 獲取顯示設(shè)備

      final DisplayContent displayContent = mRoot.getDisplayContentOrCreate(displayId);

      2 創(chuàng)建WindowState, WindowState函數(shù)中創(chuàng)建了WindowStateAnimator對(duì)象負(fù)責(zé)窗口的管理

      final WindowState win = new WindowState(this, session, client, token, parentWindow,appOp[0], seq, attrs, viewVisibility, session.mUid,
      session.mCanAddInternalSystemWindow);

      SurfaceControl 調(diào)用本地層方法android_view_SurfaceControl 設(shè)置surfaceflinger


      image.png

      image.png

      SurfaceComposerClient對(duì)象負(fù)責(zé)和surfaceflinger通信;配置好參數(shù),結(jié)束事務(wù),跨進(jìn)程調(diào)用surfaceflinger setTransactionState


      image.png

      image.png

      Surfaceflinger 對(duì)display設(shè)備和layer層操作,設(shè)置layerstack, layer和第二塊屏綁定setDisplayStateLocked
      image.png

      image.png

      Surfaceflinger輸出過(guò)程:

      1 handleTransaction handPageFlip用戶進(jìn)程更新Surface圖像時(shí)會(huì)調(diào)用,來(lái)更新Layer對(duì)象

      handleTransaction函數(shù)的作用的就是處理系統(tǒng)在兩次刷新期間的各種變化。

      包括:

      處理Layer的事務(wù),檢測(cè)是否需要更新;

      處理顯示設(shè)備的變化:

      1.顯示設(shè)備減少了,需要把顯示設(shè)備對(duì)應(yīng)的DisplayDevice移除

      2.顯示設(shè)備發(fā)生了變化,例如用戶設(shè)置了Surface、重新設(shè)置了layerStack、旋轉(zhuǎn)了屏幕等,這就需要重新設(shè)置顯示對(duì)象的屬性

      3.顯示設(shè)備增加了,創(chuàng)建新的DisplayDevice加入系統(tǒng)中。

      設(shè)置設(shè)置和顯示設(shè)備關(guān)聯(lián)在一起的Layer(主要看Layer的layerStack是否和DisplayDevice的layerStack)的TransformHint(主要指設(shè)備的顯示方向orientation)

      image.png

      處理Layer增加情況

      設(shè)置mDrawingState

      2 VSync信號(hào)定時(shí)的調(diào)用handleMessageRefresh進(jìn)行屏幕數(shù)據(jù)的刷新,輸出到屏幕;

      image.png

      preComposition函數(shù),遍歷所有的Layer對(duì)象,調(diào)用其onPreComposition函數(shù)來(lái)檢測(cè)Layer層中的圖像是否有變化。

      rebuildLayerStacks函數(shù)的作用是重建每個(gè)顯示設(shè)備的可見(jiàn)layer對(duì)象列表。通過(guò)判斷l(xiāng)ayerstack 和display設(shè)備的layerstack是否相同,來(lái)決定該layer是否在那個(gè)display設(shè)備顯示;


      image.png

      setUpHWComposer函數(shù)的作用是更新HWComposer對(duì)象中圖層對(duì)象列表以及圖層屬性。

      doComposition函數(shù)是合成所有層的圖像

      postFramebuffer先判斷系統(tǒng)是否支持composer,如果不支持,我們知道圖像已經(jīng)在doComposition函數(shù)時(shí)調(diào)用hw->swapBuffers輸出了,就返回了。如果支持硬件composer,postFramebuffer函數(shù)將調(diào)用HWComposer的commit函數(shù)繼續(xù)執(zhí)行。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多