新聞中心
Flutter是一個(gè)什么框架
Flutter是一個(gè)移動應(yīng)用程序的軟件開發(fā)工具包(SDK),具有以下特征:
創(chuàng)新互聯(lián)公司是網(wǎng)站建設(shè)技術(shù)企業(yè),為成都企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì),網(wǎng)站設(shè)計(jì),網(wǎng)站制作,網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制適合企業(yè)的網(wǎng)站。十載品質(zhì),值得信賴!
跨平臺應(yīng)用的框架,沒有使用WebView或者系統(tǒng)平臺自帶的控件,使用自身的高性能渲染引擎自繪
簡化版的瀏覽器,最大限度在android和ios上統(tǒng)一UI,包括業(yè)務(wù)邏輯和用戶體驗(yàn)
開發(fā)語言使用dart,結(jié)合C, C++, 和Skia(2D渲染引擎)構(gòu)建
支持hot reload,包含著完整的控件和工具鏈
一切皆控件,控件是每個(gè)Flutter應(yīng)用程序的基本構(gòu)建塊,與分離視圖、控制器、布局和其他屬性的框架不同,F(xiàn)lutter具有一致的統(tǒng)一對象模型:控件。一個(gè)控件可以定義:結(jié)構(gòu)元素(比如按鈕或菜單)、風(fēng)格元素(比如字體或顏色方案)、布局的方面(比如填充)、一些業(yè)務(wù)邏輯等
組合大于繼承,控件本身通常由許多小型、單用途的控件組成,結(jié)合起來產(chǎn)生強(qiáng)大的效果,類的層次結(jié)構(gòu)是扁平的,以最大化可能的組合數(shù)量
強(qiáng)化版的WebView,框架僅提供一個(gè)View層,大部分功能要依賴原生
目前只能夠運(yùn)行大部分Dart代碼(不能引入dart:mirrors或dart:html庫)
Flutter面試:渲染原理
頁面中的各界面元素(Widget)以樹的形式組織,即控件樹。Flutter通過控件樹中的每個(gè)控件創(chuàng)建不同類型的渲染對象,組成渲染對象樹。而渲染對象樹在Flutter的展示過程分為三個(gè)階段:布局、繪制、合成和渲染。
(一)布局
Flutter采用深度優(yōu)先機(jī)制遍歷渲染對象樹,決定渲染對象樹中各渲染對象在屏幕上的位置和尺寸。在布局過程中,渲染對象樹中的每個(gè)渲染對象都會接收父對象的布局約束參數(shù),決定自己的大小,然后父對象按照控件邏輯決定各個(gè)子對象的位置,完成布局過程。
為了防止因子節(jié)點(diǎn)發(fā)生變化而導(dǎo)致整個(gè)控件樹重新布局,F(xiàn)lutter加入了一個(gè)機(jī)制——布局邊界(Relayout Boundary),可以在某些節(jié)點(diǎn)自動或手動地設(shè)置布局邊界,當(dāng)邊界內(nèi)的任何對象發(fā)生重新布局時(shí),不會影響邊界外的對象,反之亦然。
二)繪制
布局完成后,渲染對象樹中的每個(gè)節(jié)點(diǎn)都有了明確的尺寸和位置。Flutter會把所有的渲染對象繪制到不同的圖層上。與布局過程一樣,繪制過程也是深度優(yōu)先遍歷,而且總是先繪制自身,再繪制子節(jié)點(diǎn)。
以下圖為例:節(jié)點(diǎn)1在繪制完自身后,會再繪制節(jié)點(diǎn)2,然后繪制它的子節(jié)點(diǎn)3、4和5,最后繪制節(jié)點(diǎn)6。
可以看到,由于一些其他原因(比如,視圖手動合并)導(dǎo)致2的子節(jié)點(diǎn)5與它的兄弟節(jié)點(diǎn)6處于了同一層,這樣會導(dǎo)致當(dāng)節(jié)點(diǎn)2需要重繪的時(shí)候,與其無關(guān)的節(jié)點(diǎn)6也會被重繪,帶來性能損耗。
為了解決這一問題,F(xiàn)lutter提出了與布局邊界對應(yīng)的機(jī)制——重繪邊界(Repaint Boundary)。在重繪邊界內(nèi),F(xiàn)lutter會強(qiáng)制切換新的圖層,這樣就可以避免邊界內(nèi)外的互相影響,避免無關(guān)內(nèi)容置于同一圖層引起不必要的重繪。
重繪邊界的一個(gè)典型場景是Scrollview。ScrollView滾動的時(shí)候需要刷新視圖內(nèi)容,從而觸發(fā)內(nèi)容重繪。而當(dāng)滾動內(nèi)容重繪時(shí),一般情況下其他內(nèi)容是不需要重繪的,這時(shí)候重繪邊界就派上用場了。
(三)合成和渲染
終端設(shè)備的頁面越來越復(fù)雜,因此Flutter的渲染樹層級通常很多,直接交付給渲染引擎進(jìn)行多圖層渲染,可能會出現(xiàn)大量渲染內(nèi)容的重復(fù)繪制,所以還需要先進(jìn)行一次圖層合成,即將所有的圖層根據(jù)大小、層級、透明度等規(guī)則計(jì)算出最終的顯示效果,將相同的圖層歸類合并,簡化渲染樹,提高渲染效率。
合并完成后,F(xiàn)lutter會將幾何圖層數(shù)據(jù)交由Skia引擎加工成二維圖像數(shù)據(jù),最終交由GPU進(jìn)行渲染,完成界面的展示。
四、總結(jié)
咱們從各種業(yè)界主流跨端方案與Flutter的對比開始,到Flutter的簡要介紹以及Flutter的運(yùn)行機(jī)制,并以界面渲染過程為例,從布局、繪制、合成和渲染三個(gè)階段講述了Flutter的實(shí)現(xiàn)原理。相信大家對Flutter已經(jīng)有一個(gè)整體認(rèn)知,趕快一起上手操作起來吧!
為什么Flutter開發(fā)APP性能最接近原生,前端程序員請關(guān)注
Flutter是谷歌公司推出的跨終端的開發(fā)框架,支持Android、iOS和WEB終端。1.0版在2018年12月5日發(fā)布,目前的最新版本是1.5,它采用的開發(fā)語言是Dart,Dart也是谷歌開發(fā)的計(jì)算機(jī)編程語言,語法類似C,是編譯型語言:
hello world例子,打印字符串“Hello World!”:
1、沒有橋接層
React Native、Weex等技術(shù)都是跨終端的框架,然而性能跟原生App存在很大差距。這是由于它們的工作原理決定的:
React Native、Weex等技術(shù)多了一個(gè)橋接層,所以界面渲染會慢一些,由于UI渲染非常頻繁,想要不卡頓,基本上比較難,性能和用戶體驗(yàn)跟原生代碼有差距。而這恰恰是Flutter的優(yōu)勢所在:
Dart可以被編譯成不同平臺的本地代碼,讓Flutter不通過橋接層直接跟平臺通信,自然性能會快一些。
2、編譯執(zhí)行
JavaScript是解釋執(zhí)行的,Dart是編譯執(zhí)行的,性能誰好一目了然。
3、Flutter Engine虛擬機(jī)
Flutter是依靠Flutter Engine虛擬機(jī)在iOS和Android上運(yùn)行的,F(xiàn)lutter Engine使用C/C++編寫,開發(fā)人員通過Flutter框架直接和API在內(nèi)部進(jìn)行交互,所以具有輸入低延遲和UI渲染高幀速率的特點(diǎn)。除了這特點(diǎn)之外,F(xiàn)lutter還提供了自己的小部件,F(xiàn)lutter小部件是使用從React獲取靈感的現(xiàn)代框架構(gòu)建的。 中心思想是您使用小部件構(gòu)建UI。
窗口小部件根據(jù)其當(dāng)前配置和狀態(tài)描述了它們的視圖。 當(dāng)窗口小部件的狀態(tài)發(fā)生更改時(shí),窗口小部件會重建其描述,框架將根據(jù)前面的描述進(jìn)行區(qū)分,以確定底層呈現(xiàn)樹從一個(gè)狀態(tài)轉(zhuǎn)換到下一個(gè)狀態(tài)所需的最小更改??梢灾苯釉贠S平臺提供的畫布上進(jìn)行描繪,也就是一些核心類庫直接放到虛擬機(jī)里面,調(diào)用起來更快。
從它的系統(tǒng)結(jié)構(gòu)可以看出,類似安卓的ART(Android Run Time)虛擬機(jī),同樣采用AOT(Ahead of TIme)技術(shù),會在APP安裝時(shí)就編譯成機(jī)器語言,不再解釋執(zhí)行,從而優(yōu)化了APP運(yùn)行的性能。
4、自帶渲染引擎
Flutter使用谷歌自己的Skia渲染引擎,而Android系統(tǒng)自帶Skia引擎,iOS平臺上Flutter也會把Skia引擎打包到APP中,從而實(shí)現(xiàn)了高效渲染。而React Native通過橋接層訪問原生UI,操作頻繁就容易出性能問題。
綜合所述,F(xiàn)lutter 是性能最接近原生代碼 的一種開發(fā)框架,未來也會是構(gòu)建谷歌Fuchsia應(yīng)用的主要方式,前途不可限量,唯一的問題就是需要學(xué)習(xí)一門新的語言:Dart,而有Java或者C#語言基礎(chǔ)的程序員會比較容易學(xué)習(xí)。
基于Weex的Flutter項(xiàng)目框架
最近在做的一個(gè)項(xiàng)目,項(xiàng)目的前期采用Weex開發(fā)。但是隨著交互復(fù)雜度的增加,Weex一處開發(fā)多處多處運(yùn)行的特征并沒有很好的體現(xiàn),相反很多時(shí)候我們還是需要做IOS和Android的適配。如今火熱的Flutter相比Weex和Rn來說,給出了更好的跨平臺解決方案。所以我們設(shè)計(jì)了一套基于Weex實(shí)現(xiàn),底層跑在Flutter Engine上的框架。
底層的Runtime采用isolate engine,框架業(yè)務(wù)邏輯,Dom的解析邏輯和Render邏輯都跑在這里。
渲染引擎采用Flutter的Skia,徹底剝離了Android和IOS的差異性.
將Weex VirsualDom的解析都替換成Flutter Widget.
設(shè)計(jì)基于Weex2Dart的Brider,使JS和Dart可以相互調(diào)用
weex-demo的性能展示
release環(huán)境下采用AOT模式,性能會有質(zhì)的飛躍。
Android-Release版本只有10m大小
相比Weex和Rn具有更好的性能,同時(shí)具有更好的跨平臺性
相比Flutter,具有動態(tài)部署的能力(Flutter Release采用AoT模式并沒有動態(tài)部署的能力,即使Debug版本也只是開發(fā)環(huán)境下才有動態(tài)化能力并沒有可以實(shí)施項(xiàng)目的能力)
只需要會Weex開發(fā)或則Rn開發(fā)就可以,不需要額外學(xué)習(xí)Dart,已有的Weex項(xiàng)目可以無縫切換。
三、Flutter的渲染機(jī)制之RenderObjectWidget、RenderObjectElement、RenderObject
RenderObjectWidget 是 Widget 例如 SizeBox , Column 等
RenderObjectElement 是這類 Widget 生成的 Element 類型,
例如 SizeBox 對應(yīng) SingleChildRenderObjectElement (單子節(jié)點(diǎn)的 Element )
RenderObject 才是真正負(fù)責(zé)繪制的對象,其中包含了 paint , layout 等方法~
Text 組件為例:
class Text extends StatelessWidget
Text build返回的是
class RichText extends MultiChildRenderObjectWidget
MultiChildRenderObjectWidget - MultiChildRenderObjectElement
RenderObjectElement 會重寫 mount
遍歷 _parent (就是上個(gè)節(jié)點(diǎn)的 element ,這個(gè) _parent 在每次的 mount 方法設(shè)置),一直遍歷知道找到最近的一個(gè) RenderObjectElement
在回顧下 inflateWidget
SingleChildRenderObjectElement
MultiChildRenderObjectElement
inflateWidget 會觸發(fā) RenderObjectWidget 的 createElement 創(chuàng)建 RenderObjectElement ,
再調(diào)用 RenderObjectElement 的 mount 方法
mount 方法調(diào)用 RenderObjectWidget 的 createRenderObject 方法創(chuàng)建 RenderObject
然后找到最近的一個(gè)父 RenderObjectElement 調(diào)用 insertRenderObjectChild 插入 RenderObject
(注意:這里不是 RenderObjectElement 的 child ,而是 RenderObjectElement 關(guān)聯(lián)的 RenderObject 的 child , element 樹里面都是 element , RenderObject 樹里面都是 RenderObject )
MultiChildRenderObjectElement 多子節(jié)點(diǎn)掛載邏輯
多節(jié)點(diǎn)添加子節(jié)點(diǎn)邏輯
每個(gè)子節(jié)點(diǎn)的 parentData 的 after 用來指向前一個(gè)子節(jié)點(diǎn) previous 指向下一個(gè)子節(jié)點(diǎn)
分享名稱:flutter渲染框架,flutter渲染引擎
本文路徑:http://fisionsoft.com.cn/article/dssipes.html