對(duì)于任何一款應(yīng)用來(lái)說(shuō),頁(yè)面的流暢度是用戶體驗(yàn)最重要的幾個(gè)指標(biāo)之一。我們需要用數(shù)據(jù)的形式標(biāo)識(shí)出頁(yè)面的流暢程度。

創(chuàng)新互聯(lián)建站從2013年成立,先為施秉等服務(wù)建站,施秉等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為施秉企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
對(duì)于大部分人而言,當(dāng)每秒的畫(huà)面達(dá)到60,也就是俗稱60FPS的時(shí)候,整個(gè)過(guò)程就是流暢的。一秒 60 幀,也就意味著平均兩幀之間的間隔為 16.7ms。但并不意味著一秒低于60幀,人眼就會(huì)感覺(jué)到卡頓。小轟將查閱到的資料列出如下:
官方SDK為開(kāi)發(fā)者提供的幀率檢測(cè)工具,使用非常簡(jiǎn)單,在 MaterialApp 下添加屬性 showPerformanceOverlay:true 。
如圖,PerformanceOverLay 會(huì)分別為我們展示了構(gòu)建(UI)耗時(shí)和渲染(Raster)耗時(shí)。
一款pub上的開(kāi)源工具,鏈接地址: fps_monitor
Flutter是谷歌公司推出的跨終端的開(kāi)發(fā)框架,支持Android、iOS和WEB終端。1.0版在2018年12月5日發(fā)布,目前的最新版本是1.5,它采用的開(kāi)發(fā)語(yǔ)言是Dart,Dart也是谷歌開(kāi)發(fā)的計(jì)算機(jī)編程語(yǔ)言,語(yǔ)法類似C,是編譯型語(yǔ)言:
hello world例子,打印字符串“Hello World!”:
1、沒(méi)有橋接層
React Native、Weex等技術(shù)都是跨終端的框架,然而性能跟原生App存在很大差距。這是由于它們的工作原理決定的:
React Native、Weex等技術(shù)多了一個(gè)橋接層,所以界面渲染會(huì)慢一些,由于UI渲染非常頻繁,想要不卡頓,基本上比較難,性能和用戶體驗(yàn)跟原生代碼有差距。而這恰恰是Flutter的優(yōu)勢(shì)所在:
Dart可以被編譯成不同平臺(tái)的本地代碼,讓Flutter不通過(guò)橋接層直接跟平臺(tái)通信,自然性能會(huì)快一些。
2、編譯執(zhí)行
JavaScript是解釋執(zhí)行的,Dart是編譯執(zhí)行的,性能誰(shuí)好一目了然。
3、Flutter Engine虛擬機(jī)
Flutter是依靠Flutter Engine虛擬機(jī)在iOS和Android上運(yùn)行的,F(xiàn)lutter Engine使用C/C++編寫(xiě),開(kāi)發(fā)人員通過(guò)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í),窗口小部件會(huì)重建其描述,框架將根據(jù)前面的描述進(jìn)行區(qū)分,以確定底層呈現(xiàn)樹(shù)從一個(gè)狀態(tài)轉(zhuǎn)換到下一個(gè)狀態(tài)所需的最小更改。可以直接在OS平臺(tái)提供的畫(huà)布上進(jìn)行描繪,也就是一些核心類庫(kù)直接放到虛擬機(jī)里面,調(diào)用起來(lái)更快。
從它的系統(tǒng)結(jié)構(gòu)可以看出,類似安卓的ART(Android Run Time)虛擬機(jī),同樣采用AOT(Ahead of TIme)技術(shù),會(huì)在APP安裝時(shí)就編譯成機(jī)器語(yǔ)言,不再解釋執(zhí)行,從而優(yōu)化了APP運(yùn)行的性能。
4、自帶渲染引擎
Flutter使用谷歌自己的Skia渲染引擎,而Android系統(tǒng)自帶Skia引擎,iOS平臺(tái)上Flutter也會(huì)把Skia引擎打包到APP中,從而實(shí)現(xiàn)了高效渲染。而React Native通過(guò)橋接層訪問(wèn)原生UI,操作頻繁就容易出性能問(wèn)題。
綜合所述,F(xiàn)lutter 是性能最接近原生代碼 的一種開(kāi)發(fā)框架,未來(lái)也會(huì)是構(gòu)建谷歌Fuchsia應(yīng)用的主要方式,前途不可限量,唯一的問(wèn)題就是需要學(xué)習(xí)一門新的語(yǔ)言:Dart,而有Java或者C#語(yǔ)言基礎(chǔ)的程序員會(huì)比較容易學(xué)習(xí)。
1.動(dòng)畫(huà)原理:在一段時(shí)間內(nèi)快速的多次改變UI外觀,由于人眼會(huì)產(chǎn)生視覺(jué)暫留所以最終看到的就是一個(gè)連續(xù)的動(dòng)畫(huà)。
UI的一次改變稱為一個(gè)動(dòng)畫(huà)幀,對(duì)應(yīng)一次屏幕刷新。
FPS:幀率,每秒的動(dòng)畫(huà)幀數(shù)。
flutter動(dòng)畫(huà)分為兩類:
常見(jiàn)動(dòng)畫(huà)模式:
是一個(gè)抽象類,主要的功能是保存動(dòng)畫(huà)的值和狀態(tài)。常用的一個(gè)Animation類是Animation double ,是一個(gè)在一段時(shí)間內(nèi)依次生成一個(gè)區(qū)間之間的值的類,可以是線性或者曲線或者其他。
可以生成除double之外的其他類型值,如:Animation Color 或 Animation Size 。
是一個(gè)動(dòng)畫(huà)控制器,控制動(dòng)畫(huà)的播放狀態(tài),在屏幕刷新的每一幀,就會(huì)生成一個(gè)新的值。
包含動(dòng)畫(huà)的啟動(dòng)forward()、停止stop() 、反向播放 reverse()等方法,在給定的時(shí)間段內(nèi)線性的生成從0.0到1.0(默認(rèn)區(qū)間)的數(shù)字。
curve:描述動(dòng)畫(huà)的曲線過(guò)程。
curvedAnimation:指定動(dòng)畫(huà)的曲線。
常用Curve:
繼承自Animatable T ,表示的就是一個(gè) Animation 對(duì)象的取值范圍,只需要設(shè)置開(kāi)始和結(jié)束的邊界值(值也支持泛型)。 它唯一的工作就是定義輸入范圍到輸出范圍的映射。
例如,Tween可能會(huì)生成從紅到藍(lán)之間的色值,或者從0到255。
Tween.animate:返回一個(gè)Animation。
映射過(guò)程:
1). Tween.animation通過(guò)傳入 aniamtionController 獲得一個(gè)_AnimatedEvaluation 類型的 animation 對(duì)象(基類為 Animation), 并且將 aniamtionController 和 Tween 對(duì)象傳入了 _AnimatedEvaluation 對(duì)象。
2). animation.value方法即是調(diào)用 _evaluatable.evaluate(parent)方法, 而 _evaluatable 和 parent 分別為 Tween 對(duì)象和 AnimationController 對(duì)象。
3). 這里的 animation 其實(shí)就是前面的 AnimationController 對(duì)象, transform 方法里面的 animation.value則就是 AnimationController 線性生成的 0.0~1.0 直接的值。 在 lerp 方法里面我們可以看到這個(gè) 0.0~1.0 的值被映射到了 begin 和 end 范圍內(nèi)了。
接收一個(gè)TickerProvider類型的對(duì)象,它的主要職責(zé)是創(chuàng)建Ticker。
防止屏幕外動(dòng)畫(huà)消耗資源。
[圖片上傳失敗...(image-115b94-1636441483468)]
過(guò)程:
回調(diào):
不使用addListener()和setState()來(lái)給widget添加動(dòng)畫(huà)。
使用AnimatedWidget,將widget分離出來(lái),創(chuàng)建一個(gè)可重用動(dòng)畫(huà)的widget,AnimatedWidget中會(huì)自動(dòng)調(diào)用addListener()和setState()
AnimatedModalBarrier、DecoratedBoxTransition、FadeTransition、PositionedTransition、RelativePositionedTransition、RotationTransition、ScaleTransition、SizeTransition、SlideTransition
如何渲染過(guò)渡,把渲染過(guò)程也抽象出來(lái):
AnimatedBuilder的示例包括: BottomSheet、 PopupMenu、ProgressIndicator、RefreshIndicator、Scaffold、SnackBar、TabBar。
MaterialPageRoute:平臺(tái)風(fēng)格一致的路由切換動(dòng)畫(huà)
CupertinoPageRoute:左右切換風(fēng)格
自定義:PageRouteBuilder
1.要?jiǎng)?chuàng)建交織動(dòng)畫(huà),需要使用多個(gè)動(dòng)畫(huà)對(duì)象(Animation)。
2.一個(gè)AnimationController控制所有的動(dòng)畫(huà)對(duì)象。
3.給每一個(gè)動(dòng)畫(huà)對(duì)象指定時(shí)間間隔(Interval)
可以同時(shí)對(duì)其新、舊子元素添加顯示、隱藏動(dòng)畫(huà).
當(dāng)AnimatedSwitcher的child發(fā)生變化時(shí)(類型或Key不同),舊child會(huì)執(zhí)行隱藏動(dòng)畫(huà),新child會(huì)執(zhí)行執(zhí)行顯示動(dòng)畫(huà)。
希望大家支持一下,感謝
Flutter 由 Google 的工程師團(tuán)隊(duì)打造,用于創(chuàng)建高性能、跨平臺(tái)的移動(dòng)應(yīng)用。
Flutter 針對(duì)當(dāng)下以及未來(lái)的移動(dòng)設(shè)備進(jìn)行優(yōu)化,專注于 Android and iOS 低延遲的輸入和高幀率。
Flutter 可以給開(kāi)發(fā)者提供簡(jiǎn)單、高效的方式來(lái)構(gòu)建和部署跨平臺(tái)、高性能移動(dòng)應(yīng)用;給用戶提供漂亮、快速、jitter-free 的 app 體驗(yàn)。
Flutter 的主要組件:
第二點(diǎn)表明,微任務(wù)會(huì)在進(jìn)行幀渲染的過(guò)程中進(jìn)行。也就是你的微任務(wù)過(guò)多,會(huì)使頁(yè)面卡頓、掉幀
最近在做Flutter知識(shí)學(xué)習(xí)的時(shí)候,有時(shí)間會(huì)看到vsync信號(hào),不知道所謂何物,所以專門抽時(shí)間簡(jiǎn)單學(xué)習(xí)了一下,以此篇文章做個(gè)記錄,具體內(nèi)容請(qǐng)查看我的參考資料即可
單緩沖,也就是只有一個(gè)緩沖區(qū)(buffer),GPU 向 buffer 中寫(xiě)入數(shù)據(jù),屏幕從 buffer 中取圖像數(shù)據(jù)、刷新后顯示,理想的情況是 顯卡幀率 和 屏幕刷新頻率 相等,每繪制一幀,屏幕顯示一幀。而實(shí)際情況是,二者之間沒(méi)有必然的大小關(guān)系,如果沒(méi)有同步機(jī)制,很容易出現(xiàn)問(wèn)題。
為了單緩沖的撕裂和效率問(wèn)題,雙緩沖誕生了。
雙緩沖有兩個(gè)緩沖區(qū): frame buffer 、 back buffer ,GPU 向 back buffer 中寫(xiě)數(shù)據(jù),屏幕從 frame buffer 中讀數(shù)據(jù)。這樣不僅可以提升效率,而且可以避免因?yàn)閹屎退⑿侣什灰恢拢瑢?dǎo)致圖像數(shù)據(jù)錯(cuò)亂。
但是這兩個(gè) buffer 怎么去同步呢?這里就需要 垂直同步信號(hào) 了
當(dāng)開(kāi)啟垂直同步后,就會(huì)變成這樣:
這樣看來(lái),幀率大于刷新頻率時(shí),幀率就會(huì)被迫跟刷新頻率保持同步,從而避免撕裂現(xiàn)象。
需要注意的是,雙緩沖 + 垂直同步信號(hào)仍然不能完全保證正常顯示,比如說(shuō):
為此,引入了 三緩沖 ,但是仍然避免不了卡頓和延遲的現(xiàn)象,這里就不詳細(xì)介紹了,可以自行查閱相關(guān)資料
理解 VSync
屏幕刷新原理 重點(diǎn)參考這篇
LCD顯示器顯像的信號(hào)HSync ,VSync
文章題目:flutter幀率,flutter性能
分享URL:http://chinadenli.net/article3/dsgopos.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開(kāi)發(fā)、企業(yè)建站、網(wǎng)站設(shè)計(jì)公司、動(dòng)態(tài)網(wǎng)站、小程序開(kāi)發(fā)、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容