當前位置:成語大全網 - 書法字典 - 顫振面試:渲染原理

顫振面試:渲染原理

頁面中的每個界面元素(小部件)都以樹的形式組織,即控件樹。Flutter通過控件樹中的每個控件創建不同類型的渲染對象,形成渲染對象樹。Flutter中渲染對象樹的顯示過程分為布局、繪制、合成、渲染三個階段。

(1)布局

Flutter使用深度優先機制來遍歷渲染對象樹,並確定屏幕上渲染對象樹中每個渲染對象的位置和大小。在布局的過程中,渲染對象樹中的每個渲染對象都會收到父對象的布局約束參數並決定自己的大小,然後父對象根據控制邏輯決定每個子對象的位置,完成布局過程。

為了防止因子節點的改變導致整個控制樹被重新布局,Flutter增加了壹個機制——重新布局邊界,可以在壹些節點自動或手動設置布局邊界。當重新放置邊界內的任何對象時,都不會影響邊界外的對象,反之亦然。

2)繪圖

布局完成後,渲染對象樹中的每個節點都有明確的大小和位置。Flutter將在不同的圖層上繪制所有渲染的對象。和布局過程壹樣,繪制過程也是深度優先遍歷,總是先畫自己,再畫子節點。

以下圖為例:節點1繪制自身後,會繪制節點2,然後是其子節點3、4、5,最後繪制節點6。

可以看出,由於壹些其他原因(例如,手動合並視圖),2的子節點5與其兄弟節點6處於同壹級別,這將導致節點2需要重繪時的性能損失。

為了解決這個問題,Flutter提出了壹種對應布局邊界的機制——重畫邊界。在重繪邊界時,Flutter會強制新圖層進行切換,以避免邊界內外的相互影響,避免將不相關的內容放在同壹圖層上造成不必要的重繪。

重繪邊界的典型場景是Scrollview。ScrollView滾動時,需要刷新視圖內容,從而觸發內容重繪。重繪滾動內容時,壹般情況下,其他內容不需要重繪,所以重繪邊界就派上了用場。

(3)合成和渲染

終端設備的頁面越來越復雜,所以Flutter的渲染樹通常有很多層次,如果直接交付給渲染引擎進行多層渲染,可能會重復繪制。所以需要先做壹個圖層合成,即按照大小、層次、透明度的規則計算所有圖層的最終顯示效果,將相同的圖層進行合並,簡化渲染樹,提高渲染效率。

合並後,Flutter會通過Skia引擎將幾何圖層數據處理成二維圖像數據,最後通過GPU渲染完成界面展示。

第四,總結

我們先從業界各種主流跨端解決方案與Flutter的對比入手,簡單介紹壹下Flutter及其運行機制,並以界面渲染過程為例,從布局、繪圖、構圖、渲染三個階段來描述Flutter的實現原理。相信大家對Flutter已經有了壹個整體的了解,那就壹起入門吧!