<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系統采用一種稱為Surface的UI架構為應用程序提供用戶界面。在Android應用程序中,每一個Activity組件都關聯有一個或者若干個窗口,每一個窗口都對應有一個Surface。有了這個Surface之后,應用程序就可以在上面渲染窗口的UI。最終這些已經繪制好了的Surface都會被統一提交給Surface管理服務SurfaceFlinger進行合成,最后顯示在屏幕上面。無論是應用程序,還是SurfaceFlinger,都可以利用GPU等硬件來進行UI渲染,以便獲得更流暢的UI。在Android應用程序UI架構中,還有一個重要的服務WindowManagerService,它負責統一管理協調系統中的所有窗口,例如管理窗口的大小、位置、打開和關閉等。 這系列講Android應用程序的Surface機制,闡述Activity、Window和View的關系,以及應用程序、WindowManagerService和SurfaceFlinger協作完成UI渲染的過程。 * **Android UI架構概述** * **Android應用程序UI框架** * **WindowManagerService** * **SurfaceFlinger** * **Android多屏支持** #### **總體架構** ![](https://box.kancloud.cn/dde130147d42ddd25e8ab915a628c9cf_697x608.png) #### **窗口(Window)的結構** * ViewRootImpl是一個虛擬根View,用來控制窗口的渲染,以及用來與WindowManagerService、SurfaceFlinger通信 * DecorView是窗口的真正根View * ContentView描述窗口的主題風格 ![](https://box.kancloud.cn/4e2c65511ee02ec7b370665c673f6b47_350x402.png) **Window與Activity的關系** ![](https://box.kancloud.cn/65d727d00bc725f1310f47458e8a2fe8_573x433.jpg) **Activity所對應的Window實際上是一個PhoneWindow** ![](https://box.kancloud.cn/2f062cf8f154fef7e1bd760add86b477_449x338.jpg) **Activity/Window的上下文** ![](https://box.kancloud.cn/e463816eaa963e06c78334b049c07522_612x444.jpg) **Window的虛擬根View -- ViewRootImpl** ![](https://box.kancloud.cn/8996c2200c81f2c8439948422e699233_826x472.jpg) **窗口繪圖表面 -- Surface** ![](https://box.kancloud.cn/014be9494feca7566edd02af6aa7bfa6_463x459.jpg) **窗口標志 -- W** ![](https://box.kancloud.cn/a8c24b3ca04ea50f831c5a31e3ee5b33_760x420.jpg) **窗口會話 -- Session** ![](https://box.kancloud.cn/35ceb7b71641d8c60b3445b81c5fb2ba_710x300.jpg) **窗口視圖 -- View** ![](https://box.kancloud.cn/5668b8ddf3b6ee9bdce5b39d4eb0a65d_470x351.jpg) #### **Android應用程序UI的繪制過程** ![](https://box.kancloud.cn/bee348cd02f4c389909fc7884a6fbedb_519x351.png) **軟件渲染過程** ![](https://box.kancloud.cn/b7f8412c22c7d87007363090b407db78_416x325.png) **硬件渲染過程** ![](https://box.kancloud.cn/dbf1f54ac14a94522ee87a71f30e9b67_538x591.png) **Display List是什么?** Display List是一個緩存繪制命令的Buffer **Display List的好處?** 當View的某些屬性發生改變時,只需要修改相應的Buffer中對應的屬即可,例如Alpha屬性,而無需對整個View進行重繪 #### **Android應用程序UI的繪制時機 – Without Vsync -- Jank** ![](https://box.kancloud.cn/9143f0807b9ec8eea379610a8ef429b4_692x262.png) #### **Android應用程序UI的繪制時機 – With VSync** ![](https://box.kancloud.cn/496e3c777d83a355b3cb537f5449e646_678x193.png) #### **Android應用程序UI的繪制時機 – With Vsync and Double Buffering** ![](https://box.kancloud.cn/0e1c48eab72ccd818c2767b280d80877_667x189.png) #### **Android應用程序UI的繪制時機 – With Vsync and Triple Buffering** ![](https://box.kancloud.cn/5d60a3b92acd8a8d2f0288555261a122_668x263.png) #### **Android系統的VSync實現** * SurfaceFlinger內部維護有一個EventThread,用來監控顯卡的VSync事件 * Android應用程序通過注冊一個DisplayEventReceiver來接收SurfaceFlinger的VSync事件 * Android應用程序接收到重繪UI請求,通過前面注冊的DisplayEventReceiver向SurfaceFlinger請求在下一個VSync事件到來時產生一個VSync通知 * Android應用程序獲得VSync通知的時候,才會真正執行重繪UI的請求 #### **WindowManagerService** **職責** * 計算窗口大小 * 計算窗口Z軸位置 * 管理輸入法窗口 * 管理壁紙窗口 * 執行窗口切換 **屏幕的基本結構** ![](https://box.kancloud.cn/01da93597c4dce354113540b0f261997_651x439.jpg) **計算窗口大小 – Content Region** ![](https://box.kancloud.cn/696afa988f7c6323ea2973eb5e03bd66_918x424.jpg) **計算窗口大小 – Visible Region** ![](https://box.kancloud.cn/d22f4fb7a0c2f667f0085eafb2fbc610_916x448.jpg) **計算窗口Z軸位置 – Window Stack** ![](https://box.kancloud.cn/00adaab7deaa12dcebf865015ecb3e9f_750x524.jpg) **計算窗口Z軸位置 – 計算時機 ** ![](https://box.kancloud.cn/fa3484bdd7ea0416ffe24220291eae97_817x352.jpg) **計算窗口Z軸位置 – 計算公式** **Z = Base Layer + WINDOW_LAYER_MULTIPLIER(5) Base Layer = T *?TYPE_LAYER_MULTIPLIER(10000) +?TYPE_LAYER_OFFSET(1000)** **計算窗口Z軸位置 – 窗口主類型** ![](https://box.kancloud.cn/8bfa0e12277a79b4856b22d7fdaddd53_580x482.png) **計算窗口Z軸位置 – 窗口子類型** ![](https://box.kancloud.cn/5db2c6cceed2d96e0b16244a6a2345d9_767x381.jpg) **管理輸入法窗口** ![](https://box.kancloud.cn/2ab9d3d4e973a65188da5c8524fadf42_573x351.jpg) **輸入法窗口在Window Stack的位置** ![](https://box.kancloud.cn/01921204c061b8a801ad7fd55abc5fc6_747x426.jpg) **管理壁紙窗口** ![](https://box.kancloud.cn/3f0cfd12e5eb36ea4bf822afd0f9b1e2_611x278.jpg) **壁紙窗口在Window Stack的位置** ![](https://box.kancloud.cn/4d39e694cfed386a2abbb9ee2568d39e_746x429.jpg) **執行窗口切換** ![](https://box.kancloud.cn/938df5cb8d41fb89ec1dcca903c44f3f_524x283.jpg) **執行窗口切換 – Starting Window** ![](https://box.kancloud.cn/1fe9bbf69f7561314ade7fc7eac5f5e3_474x561.jpg) **執行窗口切換 – 動畫** ![](https://box.kancloud.cn/3c0e92d99924024e59017bb0d715cdaf_726x373.jpg) #### **SurfaceFlinger** **職責** * 分配圖形緩沖區 * 合成圖形緩沖區 * 管理VSync事件 **渲染流程** ![](https://box.kancloud.cn/31e07a627c009d7bbafe19dede1d2d12_628x500.jpg) **分配圖形緩沖區** ![](https://box.kancloud.cn/0f8a88fd5c61278339445e511757d1f1_749x420.png) **合成圖形緩沖區** ![](https://box.kancloud.cn/a1aad0e020e1122159e057eba62bd547_747x517.png) **HWComposer實例:高通MDP4.0** ![](https://box.kancloud.cn/7efd956f732fb3f86b6fb356b6cfe877_635x571.jpg) **合成圖形緩沖區 – 可見性計算** ![](https://box.kancloud.cn/9eb6c60aae53f049d94ee3950079c5a9_495x253.jpg) **管理VSync事件** ![](https://box.kancloud.cn/033f4b7f179af33cc37c264f29fa322e_764x353.png) #### **Android多屏支持** **從4.2開始支持多屏幕** ![](https://box.kancloud.cn/a19f30b95c3746654f0992be1bf1d043_564x355.png) **屏幕類型** * Primary Display * 設備自帶的屏幕 * 由SurfaceFlinger管理 * External Display * 通過HDMI連接 * 由SurfaceFlinger監控和管理 * Virtual Display * 通過Miracast連接(基于Wifi Direct技術) * 由DisplayManagerService監控和管理 * App通過android.app.Presentation接口在指定的屏幕上創建窗口 http://developer.android.com/reference/android/app/Presentation.html ![](https://box.kancloud.cn/c0ae5ad20d4565c3b78b642dfd99a4b4_755x198.png) ![](https://box.kancloud.cn/d04836328d3c8d2c952fa4c44b266290_521x59.png)
                  <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>

                              哎呀哎呀视频在线观看