无码人妻精一区二区三区,eeuss影院www在线观看,无码精品久久久久久人妻中字,日韩av高清在线看片

推薦新聞
Flutter 渲染流水線淺析
發(fā)布者:深藍互聯(lián)
發(fā)布時間:2019-07-16
點擊:次

Flutter 渲染流水線概覽

 

總的說來 Flutter 的渲染流水線,整體架構(gòu)上(包括線程架構(gòu))跟 Android 5.x 之后的 Android View Rendering 架構(gòu)基本一致,跟目前其他主流的 UI Toolkit,如 iOS,Qt QML 也十分類似。但是在內(nèi)部實現(xiàn)的一些概念和細節(jié)上更接近于瀏覽器,特別是 WebKit/Blink,這跟 Flutter 的幾位初期成員都是來自 Chrome 團隊,負責 WebKit/Blink 的排版和繪制相關(guān)的工作有關(guān)。

 

 

跟 Android 5.x View Rendering Pipeline 一樣,F(xiàn)lutter 的渲染流水線也包括兩個線程 —— UI 線程和 GPU 線程。

UI 線程主要負責的是根據(jù) UI 界面的描述生成 UI 界面的繪制指令,而 GPU 線程負責光柵化和合成。

Flutter 以圖層樹(Layer Tree)的方式對生成的 UI 界面繪制指令進行組織,而從 Android 4.x 開始,Android View Rendering 使用的 View DisplayList 樹的方式,雖然組織的方式有所差異,但是其中的主要內(nèi)容都是 UI 界面的繪制指令。而圖層樹這種組織方式又非常類似 WebKit/Blink。

 

Android View Rendering 的 GPU 線程在 3.x 和 4.x 上是 Android UI 線程,從 5.x 開始是 Android Render 線程,2.x 時并不支持 GPU 繪制。

Flutter UI 界面的繪制

 

 

上圖顯示了 Flutter 更新 UI 界面的過程:

  1. 運行動畫,動畫的結(jié)果會導(dǎo)致 Widget State 的改變;
  2. State Changes 觸發(fā) Flutter 生成一棵新的 Widget 樹;
  3. Flutter 根據(jù)新/舊 Widget 樹的差異更新 Render 樹,重新排版更新界面布局;
  4. Flutter 根據(jù)新的 Render 樹更新 Composited Layer(合成圖層)的 Display List;
  5. 輸出新的圖層樹;

Widget

在 Flutter 里面 Widget 的定義是 UI 界面的不可變的抽象描述,它跟其他 UI Toolkit 的 Widget 或者 View 有較大差別,相比其他 UI Toolkit 里面的基礎(chǔ) UI 組件,F(xiàn)lutter Widget 的抽象層次更高,涵蓋的范圍更廣,單純從抽象層次來說,倒是更類似瀏覽器的 DOM/CSSOM,雖然兩者實際上并不相同。給我的感覺就像是混合了各種不同的對 UI 界面進行描述的方式所創(chuàng)造出的一個新概念,采用瀏覽器渲染里面抽象層次劃分的方式對其他 UI Toolkit 的基礎(chǔ) UI 組件進行層次劃分得到的一個新的抽象層。

RenderObject

Flutter 使用 RenderObject 作為 UI 界面的內(nèi)部描述方式,基于 RenderObject 計算 UI 的布局和生成 UI 的繪制指令。Flutter 里面 RenderObject 和 Render 樹的概念跟瀏覽器就基本差不多了,連命名都一樣。從抽象層次和主要功能來說,RenderObject 跟其他 UI Toolkit 里面的 Widget 和 View 這些基礎(chǔ) UI 組件也比較接近。

Composited Layer

Flutter 使用 Composited Layer 來對 RenderObject 的繪制進行組織,通常一個 Composited Layer 對應(yīng)一棵 RenderObject 子樹,Composited Layer 的 Display List 記錄了這棵 RenderObject 子樹的繪制指令,這跟瀏覽器里面的 RenderObject 和 Composited Layer 基本是一樣的。

不同的 UI Toolkit 對圖層的處理方式并不一樣,Android 沒有一個完整的圖層概念,只是間接地允許應(yīng)用指定為特定的 View 子樹生成圖層,并且這個圖層的概念跟 Flutter 里面的圖層相比,F(xiàn)lutter 具備更高的抽象層次,它是繪制指令的一種組織方式,并不一定就需要分配額外的緩存做間接光柵化,F(xiàn)lutter 內(nèi)部采用一個重復(fù)繪制次數(shù)閾值來控制是否為圖層分配額外的緩存,通過這種方式來平衡內(nèi)存占用和重復(fù)光柵化的性能損失。iOS 有比較完整的圖層概念,跟 Flutter 更接近,并允許應(yīng)用自己控制。

Flutter 光柵化和合成

 

Flutter 光柵化和合成的流水線設(shè)計對比瀏覽器就簡單的多了,跟其他 UI Toolkit 基本一樣,只需要在 GPU 線程完成全部的光柵化和合成,并且全部由 GPU 實現(xiàn)。Android HWUI 的光柵化和合成將來應(yīng)該也會改用 Skia 的實現(xiàn),所以長遠來看,Android 和 Flutter,另外也包括 Chrome, 在光柵化和合成的實現(xiàn)上應(yīng)該會是使用同樣的代碼。

 

關(guān)注深藍互聯(lián)公眾號
Copyright ? 2013-2025 深藍互聯(lián) 版權(quán)所有
友情鏈接: