真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

flutter渲染程度,flutter性能對比

3.0.flutter之生命周期和渲染原理

生命周期是別人封裝好的一套方法接口,然后提供回調方法給我們調用,生命周期本質是回調方法;

我們提供的服務有:成都網(wǎng)站建設、成都網(wǎng)站設計、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、臨沭ssl等。為1000多家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的臨沭網(wǎng)站制作公司

1.監(jiān)聽widget的事件

2.初始化數(shù)據(jù)

創(chuàng)建數(shù)據(jù)

發(fā)送網(wǎng)絡請求

3.內(nèi)存管理

銷毀數(shù)據(jù),銷毀監(jiān)聽者

銷毀timer等

//1.StatelessWidget構造函數(shù)調用...1

//2.StatelessWidget的buil方法調用...2

//1.StatefulWidget的構造函數(shù)...1

//2.State的構造函數(shù)...2

//3.State的initState的方法...3

//4.State的build的方法...4

//5.State的dispose的方法...5

setState(() {})

可被

StatefulElement _element = context;

_element.markNeedsBuild();

替代

參考:

三、Flutter的渲染機制之RenderObjectWidget、RenderObjectElement、RenderObject

RenderObjectWidget 是 Widget 例如 SizeBox , Column 等

RenderObjectElement 是這類 Widget 生成的 Element 類型,

例如 SizeBox 對應 SingleChildRenderObjectElement (單子節(jié)點的 Element )

RenderObject 才是真正負責繪制的對象,其中包含了 paint , layout 等方法~

Text 組件為例:

class Text extends StatelessWidget

Text build返回的是

class RichText extends MultiChildRenderObjectWidget

MultiChildRenderObjectWidget - MultiChildRenderObjectElement

RenderObjectElement 會重寫 mount

遍歷 _parent (就是上個節(jié)點的 element ,這個 _parent 在每次的 mount 方法設置),一直遍歷知道找到最近的一個 RenderObjectElement

在回顧下 inflateWidget

SingleChildRenderObjectElement

MultiChildRenderObjectElement

inflateWidget 會觸發(fā) RenderObjectWidget 的 createElement 創(chuàng)建 RenderObjectElement ,

再調用 RenderObjectElement 的 mount 方法

mount 方法調用 RenderObjectWidget 的 createRenderObject 方法創(chuàng)建 RenderObject

然后找到最近的一個父 RenderObjectElement 調用 insertRenderObjectChild 插入 RenderObject

(注意:這里不是 RenderObjectElement 的 child ,而是 RenderObjectElement 關聯(lián)的 RenderObject 的 child , element 樹里面都是 element , RenderObject 樹里面都是 RenderObject )

MultiChildRenderObjectElement 多子節(jié)點掛載邏輯

多節(jié)點添加子節(jié)點邏輯

每個子節(jié)點的 parentData 的 after 用來指向前一個子節(jié)點 previous 指向下一個子節(jié)點

為什么Flutter開發(fā)APP性能最接近原生,前端程序員請關注

Flutter是谷歌公司推出的跨終端的開發(fā)框架,支持Android、iOS和WEB終端。1.0版在2018年12月5日發(fā)布,目前的最新版本是1.5,它采用的開發(fā)語言是Dart,Dart也是谷歌開發(fā)的計算機編程語言,語法類似C,是編譯型語言:

hello world例子,打印字符串“Hello World!”:

1、沒有橋接層

React Native、Weex等技術都是跨終端的框架,然而性能跟原生App存在很大差距。這是由于它們的工作原理決定的:

React Native、Weex等技術多了一個橋接層,所以界面渲染會慢一些,由于UI渲染非常頻繁,想要不卡頓,基本上比較難,性能和用戶體驗跟原生代碼有差距。而這恰恰是Flutter的優(yōu)勢所在:

Dart可以被編譯成不同平臺的本地代碼,讓Flutter不通過橋接層直接跟平臺通信,自然性能會快一些。

2、編譯執(zhí)行

JavaScript是解釋執(zhí)行的,Dart是編譯執(zhí)行的,性能誰好一目了然。

3、Flutter Engine虛擬機

Flutter是依靠Flutter Engine虛擬機在iOS和Android上運行的,F(xiàn)lutter Engine使用C/C++編寫,開發(fā)人員通過Flutter框架直接和API在內(nèi)部進行交互,所以具有輸入低延遲和UI渲染高幀速率的特點。除了這特點之外,F(xiàn)lutter還提供了自己的小部件,F(xiàn)lutter小部件是使用從React獲取靈感的現(xiàn)代框架構建的。 中心思想是您使用小部件構建UI。

窗口小部件根據(jù)其當前配置和狀態(tài)描述了它們的視圖。 當窗口小部件的狀態(tài)發(fā)生更改時,窗口小部件會重建其描述,框架將根據(jù)前面的描述進行區(qū)分,以確定底層呈現(xiàn)樹從一個狀態(tài)轉換到下一個狀態(tài)所需的最小更改。可以直接在OS平臺提供的畫布上進行描繪,也就是一些核心類庫直接放到虛擬機里面,調用起來更快。

從它的系統(tǒng)結構可以看出,類似安卓的ART(Android Run Time)虛擬機,同樣采用AOT(Ahead of TIme)技術,會在APP安裝時就編譯成機器語言,不再解釋執(zhí)行,從而優(yōu)化了APP運行的性能。

4、自帶渲染引擎

Flutter使用谷歌自己的Skia渲染引擎,而Android系統(tǒng)自帶Skia引擎,iOS平臺上Flutter也會把Skia引擎打包到APP中,從而實現(xiàn)了高效渲染。而React Native通過橋接層訪問原生UI,操作頻繁就容易出性能問題。

綜合所述,F(xiàn)lutter 是性能最接近原生代碼 的一種開發(fā)框架,未來也會是構建谷歌Fuchsia應用的主要方式,前途不可限量,唯一的問題就是需要學習一門新的語言:Dart,而有Java或者C#語言基礎的程序員會比較容易學習。

二、Flutter的渲染機制以及setState()背后的原理

開始FrameWork層會通知Engine表示自己可以進行渲染了,在下一個Vsync信號到來之時,Engine層會通過Windows.onDrawFrame回調Framework進行整個頁面的構建與繪制。每次收到渲染頁面的通知后,Engine調用Windows.onDrawFrame最終交給_handleDrawFrame()方法進行處理。最后會走到 WidgetsBinding.drawFrame() = buildOwner.buildScope(renderViewElement) = _dirtyElements[index].rebuild() = performRebuild() 這里會觸發(fā)當前element的widget的build方法= updateChild() 注意這里已經(jīng)是子節(jié)點進行接下來的操作了= 子節(jié)點update() = 子節(jié)點rebuild() = 子節(jié)點performRebuild() ...

小結:所以說在widget樹中,越高層的 build() 里調用 setState() 會導致遍歷所有的子節(jié)點=遍歷所有子節(jié)點的子節(jié)點...

話術總結: setState() 會將當前的 element 標記為 臟 ,并交由 buildOwner ,由 buildOwner 加入自己的 臟列表中 ,等收到頁面渲染的通知后(這里流程簡略掉),會調用 buildOwenr. buildScope () ,這里會遍歷 臟列表 然后每一個都會調用 rebuild() , rebuild() 又會調用 performRebuild() , performRebuild() 則會調用 build() 方法重建當前的 element ,然后調用 updateChild () 開始更新子節(jié)點,進而觸發(fā)子節(jié)點的 rebuild() 方法,進行下一輪的周期...一直到最后一個節(jié)點

Flutter Widget的渲染原理

抽象類Element 有mount方法

抽象類Widget 有createElement方法

RenderObjectWidget有createElement方法 和??createRenderObject方法

每一個Widget, 都有createElement方法,通過createElement方法 創(chuàng)建一個Element對象,

Element加入Element樹中,它會創(chuàng)建三種Element ,每個Element 有個mount方法

第一種:RenderObjectElement(RenderObjectWidget的createElement方法)

mount方法中 調用

widget.createRenderObject(this) ,創(chuàng)建RenderObject對象,RenderObject對象加入Render樹中

第二種:StatefulElement繼承ComponentElement?

第三種:StatelessElement繼承ComponentElement?

并不是所有的Widget都會被獨立渲染!只有繼承RenderObjectWidget的才會創(chuàng)建RenderObject對象!?

Flutter面試:渲染原理

頁面中的各界面元素(Widget)以樹的形式組織,即控件樹。Flutter通過控件樹中的每個控件創(chuàng)建不同類型的渲染對象,組成渲染對象樹。而渲染對象樹在Flutter的展示過程分為三個階段:布局、繪制、合成和渲染。

(一)布局

Flutter采用深度優(yōu)先機制遍歷渲染對象樹,決定渲染對象樹中各渲染對象在屏幕上的位置和尺寸。在布局過程中,渲染對象樹中的每個渲染對象都會接收父對象的布局約束參數(shù),決定自己的大小,然后父對象按照控件邏輯決定各個子對象的位置,完成布局過程。

為了防止因子節(jié)點發(fā)生變化而導致整個控件樹重新布局,F(xiàn)lutter加入了一個機制——布局邊界(Relayout Boundary),可以在某些節(jié)點自動或手動地設置布局邊界,當邊界內(nèi)的任何對象發(fā)生重新布局時,不會影響邊界外的對象,反之亦然。

二)繪制

布局完成后,渲染對象樹中的每個節(jié)點都有了明確的尺寸和位置。Flutter會把所有的渲染對象繪制到不同的圖層上。與布局過程一樣,繪制過程也是深度優(yōu)先遍歷,而且總是先繪制自身,再繪制子節(jié)點。

以下圖為例:節(jié)點1在繪制完自身后,會再繪制節(jié)點2,然后繪制它的子節(jié)點3、4和5,最后繪制節(jié)點6。

可以看到,由于一些其他原因(比如,視圖手動合并)導致2的子節(jié)點5與它的兄弟節(jié)點6處于了同一層,這樣會導致當節(jié)點2需要重繪的時候,與其無關的節(jié)點6也會被重繪,帶來性能損耗。

為了解決這一問題,F(xiàn)lutter提出了與布局邊界對應的機制——重繪邊界(Repaint Boundary)。在重繪邊界內(nèi),F(xiàn)lutter會強制切換新的圖層,這樣就可以避免邊界內(nèi)外的互相影響,避免無關內(nèi)容置于同一圖層引起不必要的重繪。

重繪邊界的一個典型場景是Scrollview。ScrollView滾動的時候需要刷新視圖內(nèi)容,從而觸發(fā)內(nèi)容重繪。而當滾動內(nèi)容重繪時,一般情況下其他內(nèi)容是不需要重繪的,這時候重繪邊界就派上用場了。

(三)合成和渲染

終端設備的頁面越來越復雜,因此Flutter的渲染樹層級通常很多,直接交付給渲染引擎進行多圖層渲染,可能會出現(xiàn)大量渲染內(nèi)容的重復繪制,所以還需要先進行一次圖層合成,即將所有的圖層根據(jù)大小、層級、透明度等規(guī)則計算出最終的顯示效果,將相同的圖層歸類合并,簡化渲染樹,提高渲染效率。

合并完成后,F(xiàn)lutter會將幾何圖層數(shù)據(jù)交由Skia引擎加工成二維圖像數(shù)據(jù),最終交由GPU進行渲染,完成界面的展示。

四、總結

咱們從各種業(yè)界主流跨端方案與Flutter的對比開始,到Flutter的簡要介紹以及Flutter的運行機制,并以界面渲染過程為例,從布局、繪制、合成和渲染三個階段講述了Flutter的實現(xiàn)原理。相信大家對Flutter已經(jīng)有一個整體認知,趕快一起上手操作起來吧!


本文名稱:flutter渲染程度,flutter性能對比
文章源于:http://weahome.cn/article/hoehdo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部