精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何讓 Flutter 應用更好地使用 SVG?

開發 開發工具
本文將帶大家了解 SVG 在 Flutter 應用中的性能問題,分享 UC 瀏覽器內核技術團隊在 Flutter 應用中改進 SVG 應用的探索實踐。

SVG 作為一個強大的矢量圖標準格式,在圖片清晰度的表現力上有著位圖無法比擬的優勢。那么是否 SVG 就是絕對的首選了呢?事實可能并非如此。本文將帶大家了解 SVG 在 Flutter 應用中的性能問題,分享 UC 瀏覽器內核技術團隊在 Flutter 應用中改進 SVG 應用的探索實踐。

例說歷史

在計算機的世界里,很多空間優化都隱藏著計算消耗,比如下面這張色彩和形狀豐富的 4k 圖片(其實也可以是 8k,屏幕夠大就可以看到),壓縮后只有 5kB 大小。[[332770]][[332771]]

??

??

 

 

如果這個 5kB 用 PNG 來存儲的圖片,是下圖這個樣子。

??

??

表現力天差地別。

為了達到類似的清晰度,一般操作系統會協助應用打包時在 UI 資源中歸集多個分辨率的圖片。

??

??

32x32

 

??

??

64x64


 

??

??

256x256

 

 

??

??

1024x1024

 

上面這一個圖標,資源包占用超過 120kB,其中最大的一個版本,運行內存占用在 4MB。

這么看來,SVG 圖片應該是絕對首選吧?

并非如此。在給 Flutter 做 SVG 支持分析之前,開發者可能覺得各個移動系統 API 中沒有提供是個很大缺憾。

而經過光柵化代價數據分析后,也能理解了系統對盲目使用 SVG 帶來問題的擔憂。

比如還是上面這個 SVG 圖片,在驍龍 626 的手機上,Flutter 光柵化到 64x64 的區域需要 34ms,一個 SVG 讓應用與 60 幀流暢度徹底無緣。實測 IPhone X 需要 8ms,只能流暢顯示兩個。

另外補充一點,SVG 或者說矢量圖的應用需求是 UI 扁平化趨勢興起后才出現的。在擬物化的時期,拋開光柵化速度不說,矢量圖在顯示寫實風格的圖標時,缺陷是無法容忍的。比如 doggy,用較激進的追蹤矢量化后(右側),已經數碼感十足,存儲占用也遠超 PNG。

??

??

好在,扁平化的矢量圖在工程推進時,也在有意無意回避前面說的問題,大部分都走簡約風。所以只要避開陷阱,SVG 還是在很多場景可以做到表現優秀的。

應用現狀

Flutter 項目主線沒有支持

Flutter 的基礎組件 Skia 代碼中有 SVG 目錄,但別誤會了,Skia 只有序列化至 SVG 的功能,沒有解碼繪制 SVG 的能力。

框架開發計劃目前也沒有支持的打算:https://github.com/flutter/flutter/issues/1831

OS 也沒有支持的意向

這是可以理解的,因為龐大如 Android 和 iOS 也默認不支持:

大家的共識是,全功能的 SVG 支持工作量不小,還有性能隱患(都是拐著彎提到)。

SVG 的鍋,矢量字體方案不用背

前面 SVG 咨詢,在建議解決方案中,都提到用矢量字體解決。矢量字體:

  • 主流 OS 都自帶的支持。
  • 基本只能單色。
  • 不用依賴 xml。
  • 由于單色輸出,很多圖層繪制疊加等等不可控的性能影響要素都被排除。
  • 系統方便做位圖緩存管理(我們開發者工具后續可以再研究)。

雖然在 SVG 投入不少研究,也不得不承認,字體矢量圖輸出是目前很務實高效的方案。

配合工具流程改進 SVG 應用

SVG 作為一個強大的矢量圖標準格式,還是可以找到合適的應用的。比如多彩圖標,方便熱更新,生產工具對此格式的廣泛支持。

讓 SVG 再次偉大

在 OS 和 runtime 都拋棄 SVG 的情況下,flutter_svg 包毅然然扛起大旗,簡單快捷的給 Flutter 提供了 SVG 渲染解碼的能力,顯示出 Flutter/Dart 不俗的擴展潛能。

flutter_svg 的使用非常簡單,提供和 flutter framework 中 image_provider 類似的接口。下面兩段代碼就是分別顯示來自 asset 和網絡的 SVG 圖片:

SvgPicture.asset( 
'assets/adsmall.svg',
placeholderBuilder: (BuildContext context) => Container(
child: const CircularProgressIndicator()),
),

SvgPicture.network(
'https://raw.githubusercontent.com/dnfield/flutter_svg/master/example/assets/deborah_ufw/new-camera.svg',
placeholderBuilder: (BuildContext context) => Container(
child: const CircularProgressIndicator()),
),

用工具避坑

不能對 SVG 的性能隱患坐視不理。

UC 瀏覽器內核技術團隊開發了一個【資源面板】工具,可以方便地連接 Flutter 應用,實時顯示資源分配的內存,對其中的 SVG 圖片,資源面板提供了預覽和獲取光柵化損耗的功能。

??

??

通過記錄和對比 SVG 在實際移動設備上的光柵化損耗,我們可以方便地識別出有隱患的 SVG 文件,將 SVG 的應用安排妥當。

??

??

通過實際 Rasterization Cost 的對比可以看到,簡約風格的圖標,時間消耗到 16.66ms 來說在驍龍 626 上也還是可以接受的。

實現原理

flutter_svg

flutter_svg 是一個 dart package,提供解析來自 network、asset、memory 等 SVG 的能力。

由于解析結果并不是 ui.Image 這樣的位圖,所以 flutter_svg 并沒有和 ImageCache 協作,而是自己實現了一套 PictureCache , PictureCache 中緩存的是 ui.Picture ,這個類實際是 skia 引擎的 SkPicture Wrapper,二進制方式記錄具體的 SVG 繪制指令。

ui.Picture 類占用的內存不會很大,緩存基本上是為了避免反復 parse xml。

比如 SvgPicture.asset 的構造接口如下:

SvgPicture.asset( 
String assetName, {
Key key,
this.matchTextDirection = false,
AssetBundle bundle,
String package,
this.width,
this.height,
this.fit = BoxFit.contain,
this.alignment = Alignment.center,
this.allowDrawingOutsideViewBox = false,
this.placeholderBuilder,
Color color,
BlendMode colorBlendMode = BlendMode.srcIn,
this.semanticsLabel,
this.excludeFromSemantics = false,
}) : pictureProvider = ExactAssetPicture(
allowDrawingOutsideViewBox == true
? svgStringDecoderOutsideViewBox
: svgStringDecoder,
assetName,
bundle: bundle,
package: package,
colorFilter: _getColorFilter(color, colorBlendMode)),
super(key: key);

SvgPicture 的 _picture,由 pictureProvider 的 stream 通知更新:

void _resolveImage() { 
final PictureStream newStream = widget.pictureProvider
.resolve(createLocalPictureConfiguration(context));
assert(newStream != null);
_updateSourceStream(newStream);
}

pictureProvider 的 stream 由 來自 pictureCache 的 completer 填充 ui.Picture 。

// in PictureProvider<T>.resolve 
stream.setCompleter(
_cache.putIfAbsent(
key,
() => load(key, onError: onError),
),
);

Debug 和 Profile 模式下,通過添加配合代碼,開發者工具可以在 PictureCache 中查詢所有現存的 SvgPicture 。

光柵化時間獲取

光柵化的發起接口是 ui.Picutre.toImage 方法,具體的計時在 rasterizer 線程。

??

??

??

??

補充說明

Android VectorDrawable

Android 提供了一套 VectorDrawable 方案,是一個簡化版的 SVG , 格式和特性不完全兼容,提供轉換工具。從文檔來看,確實是擔心過度復雜的 SVG 影響性能。參考文檔:https://developer.android.com/studio/write/vector-asset-studio

單獨 SVG 位圖緩存優化

目前 Flutter 用的是一次性光柵化輸出每幀的模式,和 chromium 的 cc 按區域構建位圖再合成不同,如果在光柵化輸出時標記 SVG 的 Picture,緩存這部分位圖可以提升幀數,代價當然是內存損耗。

這個功能目前純用 Dart 無法方便實現,因為在 dart.ui 線程中,RenderPicture 無法預見具體的光柵化分辨率。

 

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2018-10-11 09:40:53

前端JavaScript編程語言

2021-02-25 22:17:19

開發技術編程

2019-03-22 14:20:26

管理多云云計算

2013-05-02 14:39:11

iOS開發iOS應用崩潰解決

2022-09-12 23:53:53

JavaScript條件判斷開發

2015-02-26 09:19:00

2020-11-24 12:07:57

阿里云serverless容器

2012-02-08 16:19:09

ibmdw

2012-02-14 12:50:13

ibmdw

2015-11-18 09:56:24

數據中心監控

2015-08-21 10:38:26

DaaS

2014-10-29 09:55:58

程序員代碼

2021-01-28 14:53:19

PHP編碼開發

2017-10-12 15:20:57

數據中心遷移數據云端

2022-05-06 15:58:44

物聯網社區物聯網應用

2022-05-05 16:49:12

物聯網社區應急

2011-07-19 09:22:20

活動目錄

2015-03-12 15:00:00

編程12條自問更好地編程

2012-12-20 09:46:42

應用虛擬化

2023-11-09 11:48:41

點贊
收藏

51CTO技術棧公眾號

少妇视频在线| 精品国产99久久久久久宅男i| 日韩欧美黄色| 日本道精品一区二区三区| 亚洲国产午夜伦理片大全在线观看网站 | 欧美一级视频在线播放| 男人天堂综合| 国产高清无密码一区二区三区| 欧美激情视频在线免费观看 欧美视频免费一| 中文字幕99页| 欧美日韩精品一区二区三区视频| 亚洲人亚洲人成电影网站色| 国产在线视频欧美一区二区三区| 波多野结衣高清在线| 在线看片不卡| 日韩精品欧美国产精品忘忧草| 精品99在线视频| 中文字幕伦理免费在线视频| 久久免费美女视频| 97超碰资源| 国产美女www| 亚洲精品123区| 神马久久久久久| 性久久久久久久久久| 九九99久久精品在免费线bt| 日本韩国精品一区二区在线观看| 免费看欧美黑人毛片| porn亚洲| 91在线你懂得| 91精品国产91久久久久青草| 欧美在线视频精品| 99伊人成综合| 欧美乱大交xxxxx另类电影| 日韩视频在线观看免费视频| 精品一区二区男人吃奶| 日韩一区二区免费高清| 91丨九色丨蝌蚪| 日本综合久久| 日韩欧美亚洲国产一区| 国产一二三四区在线观看| 国产福利小视频在线观看| 99久久精品国产精品久久| 亚洲自拍在线观看| 一区二区视频网| 久热re这里精品视频在线6| 久久全国免费视频| 久久久久久久久久久久久久久久久| 久久亚洲国产| 日韩在线免费高清视频| 国产综合精品久久久久成人av| 亚洲高清极品| 日韩电影中文 亚洲精品乱码 | 国产精品一二三在线观看| 婷婷成人激情| 国产精品国产三级国产普通话蜜臀| 欧洲成人一区二区| 理论在线观看| 国产亚洲一区二区在线观看| 欧美资源一区| 川上优的av在线一区二区| 久久久高清一区二区三区| 欧美日韩三区四区| 国产二区在线播放| 中文一区二区在线观看| 亚洲国产一区二区精品视频 | 欧美国产极速在线| 精品视频久久久久| 欧美三区在线| 国内精品久久久久伊人av| 国产在线精品观看| 亚洲欧美久久久| 国产99视频精品免视看7| 波多野结衣在线观看视频| 日韩va欧美va亚洲va久久| 国产精品www网站| 亚洲视频在线观看一区二区| 国产精品主播直播| 国产精品久久久久免费| 天堂中文字幕av| 久久久久亚洲综合| 一区二区三区精品国产| 91国内在线| 狠狠干狠狠久久| 欧美午夜aaaaaa免费视频| 亚洲人成网站在线在线观看| 日韩免费在线观看| 强迫凌虐淫辱の牝奴在线观看| 一本久久青青| 久久深夜福利免费观看| 久久久久久久久艹| 可以看av的网站久久看| 91精品国产自产在线观看永久| 精品久久在线观看| 久久亚洲综合色一区二区三区| 亚洲第一导航| 丁香高清在线观看完整电影视频| 色婷婷久久一区二区三区麻豆| 波多野结衣xxxx| 久久电影在线| 色噜噜狠狠狠综合曰曰曰88av| 综合五月激情网| 亚洲影音先锋| 亚洲综合在线小说| 蜜桃免费在线| 一区二区三区在线免费观看| 国产精品无码一本二本三本色| 国色天香久久精品国产一区| 日韩精品在线免费观看视频| 人人澡人人澡人人看| 国产精品一区亚洲| 91午夜理伦私人影院| 五月婷婷久久久| 亚洲色图.com| 日韩在线第三页| 懂色av一区二区| 久久久久www| 久久精品五月天| 91在线视频18| 日韩精品久久一区二区| 日本成人一区二区| 亚洲视频国产视频| 日本一区二区三区免费视频| 国产综合成人久久大片91| 日本在线免费观看一区| 国内精彩免费自拍视频在线观看网址 | 亚洲一区有码| 亚洲香蕉成视频在线观看| 国产第一页在线播放| 精品中文字幕一区二区小辣椒 | 欧美h版在线| 国产大片精品免费永久看nba| 免费av一级片| 一区二区三区在线观看欧美| www.com污| 日韩成人综合| 国产精品精品久久久久久| 午夜视频福利在线| 亚洲成人综合网站| 亚洲欧美激情一区二区三区| 欧美韩日高清| 国产精品一区二区三区在线播放| 韩国精品视频| 日本久久电影网| 97超碰在线资源| 亚洲欧美成人| 欧美国产综合视频| 国产免费不卡| 亚洲精品日韩久久久| 国产成人精品一区二三区| 成人丝袜18视频在线观看| 欧美xxxx吸乳| 日韩一区二区三区精品视频第3页| www.亚洲一区| 国产精品丝袜黑色高跟鞋| 亚洲欧洲在线观看av| 天天看片天天操| 亚洲九九视频| 成人av免费在线看| 黄色大片在线| 亚洲激情小视频| 亚洲欧美偷拍视频| 久久九九影视网| 亚洲一区二区蜜桃| 99视频精品全部免费在线视频| 国产欧美一区二区三区四区| 蜜桃视频在线观看www社区 | 欧美一级xxxx| 忘忧草精品久久久久久久高清| 成人激情电影一区二区| 中文在线字幕免费观看| 亚洲大胆美女视频| 亚洲天堂男人av| 中文字幕制服丝袜一区二区三区| 四虎1515hh.com| 亚洲高清自拍| 日韩不卡av| 亚洲一区二区小说| 韩国精品久久久999| 久蕉在线视频| 91精品麻豆日日躁夜夜躁| 久久久精品视频在线| 91免费视频观看| 日本三级黄色网址| 欧美日本亚洲韩国国产| 欧美国产二区| 电影中文字幕一区二区| 97香蕉久久夜色精品国产| 久久av少妇| 日韩丝袜美女视频| 区一区二在线观看| 亚洲欧洲美洲综合色网| 亚洲の无码国产の无码步美| 奇米四色…亚洲| 91动漫在线看| 日韩在线中文| 久久国产精品久久| 青青青国产精品| 97久久伊人激情网| 麻豆av免费在线观看| 亚洲电影在线看| 91theporn国产在线观看| 亚洲午夜免费视频| 欧美成人另类视频| 成人av综合一区| 超碰人人草人人| 久久精品人人| 日韩成人手机在线| 久久一级电影| 欧美精品成人一区二区在线观看| 成人精品视频在线观看| 日韩免费av在线| heyzo在线欧美播放| 精品国内产的精品视频在线观看| 亚洲 欧美 自拍偷拍| 欧美一区永久视频免费观看| 国产精品尤物视频| 午夜精品福利在线| 欧美日韩色视频| 国产网站一区二区| 中文字幕 日本| 国产福利精品一区二区| 亚洲久久中文字幕| 日韩精品国产欧美| 91好吊色国产欧美日韩在线| 一区二区三区四区日韩| 视频在线一区二区三区| 亚洲丁香日韩| 精品日产一区2区三区黄免费| 日本成人精品| 亚洲va电影大全| 性欧美video另类hd尤物| 国产不卡视频在线| 天堂8中文在线最新版在线| 欧美国产日韩一区| 污影院在线观看| 蜜臀久久99精品久久久无需会员 | 欧美国产丝袜视频| 免费在线观看成年人视频| 成人丝袜高跟foot| 免费不卡的av| 丁香婷婷综合色啪| 中国男女全黄大片| 成人性视频免费网站| 国产伦精品一区二区三区妓女下载| 精品无人码麻豆乱码1区2区| 在线观看免费的av| 毛片不卡一区二区| 91高清国产视频| 狠狠色丁香婷综合久久| 国产3p在线播放| 久久国产剧场电影| 天天操精品视频| 国产一区二区美女诱惑| 樱花草www在线| 国产成人午夜高潮毛片| 潘金莲一级淫片aaaaa| 国产91丝袜在线播放| 亚洲国产精品狼友在线观看| 成人做爰69片免费看网站| 精品国产乱码久久久久夜深人妻| 国产·精品毛片| 日韩www视频| 久久精品亚洲乱码伦伦中文| 99久久99久久精品免费看小说.| 欧美激情在线一区二区| 久久嫩草捆绑紧缚| 一区二区三区四区不卡视频| 麻豆一区二区三区精品视频| 精品免费在线视频| 波多野结衣一二区| 欧美日本精品一区二区三区| 国产手机av在线| 精品国产伦理网| 免费一级在线观看| 日韩最新av在线| 国产精品69xx| 日本免费一区二区三区视频观看| av成人在线观看| 99影视tv| 国产麻豆一区二区三区精品视频| 神马影院一区二区三区| 综合久久一区| 亚洲中文字幕无码不卡电影| 久久激情综合网| 性欧美18—19sex性高清| 久久久美女毛片| 欧美xxxx黑人xyx性爽| 亚洲无线码一区二区三区| 无码人妻精品一区二区三区不卡 | 一区二区三区四区在线播放| 国产手机在线视频| 欧美精品丝袜中出| 亚洲国产精品欧美久久| 国产丝袜一区视频在线观看 | 欧美一级黄色影院| 国产成人自拍网| 特级西西www444人体聚色| 亚洲精品午夜久久久| 国产一级免费视频| 日韩欧美色综合网站| 波多野结衣在线网站| 97久久精品人人澡人人爽缅北| 亚洲狼人综合| 麻豆91蜜桃| 国产精品99一区二区| 在线免费观看视频黄| 成人午夜电影小说| 日本 欧美 国产| 欧美中文字幕不卡| 天天操天天干天天| 久久天天躁狠狠躁夜夜躁| 亚洲伊人av| 成人欧美一区二区| 五月婷婷六月综合| 日韩av手机版| 久久亚洲精精品中文字幕早川悠里| 婷婷在线精品视频| 欧美视频日韩视频| 免费国产在线视频| 97在线视频观看| 我要色综合中文字幕| 亚洲欧美日韩精品在线| 久久久久国产精品午夜一区| 亚洲av人人澡人人爽人人夜夜| 亚洲欧美日韩综合aⅴ视频| 日韩乱码一区二区三区| 亚洲精品视频在线播放| 男女免费观看在线爽爽爽视频| 亚洲精品欧美日韩| 色爱综合网欧美| 久久婷五月综合| 国产欧美精品国产国产专区| 国产精品一区无码| 日韩精品视频免费| xxxx成人| 国产精品区一区二区三在线播放 | 另类专区欧美制服同性| 日本免费在线一区| 一区二区成人国产精品| 日本成人在线一区| 国精产品一区二区三区| 色婷婷亚洲综合| 麻豆app在线观看| 国产成人综合久久| 日韩电影免费在线观看| 久久久精品麻豆| 国产精品国产三级国产三级人妇 | 亚洲精品成人a8198a| 免费不卡在线视频| 91无套直看片红桃在线观看| 欧美日韩精品系列| 黄色网在线免费看| 99中文字幕| 国产欧美日韩亚洲一区二区三区| 黄色污在线观看| 91久久精品一区二区三| 电影av一区| 成人a免费视频| 欧美日本二区| 可以直接看的无码av| 91黄色小视频| 久cao在线| 成人动漫视频在线观看免费| 18成人免费观看视频| 一起草在线视频| 欧美性猛交xxxx黑人| av播放在线| av资源站久久亚洲| 99亚洲伊人久久精品影院红桃| 爱爱免费小视频| 欧美三级电影在线看| 婷婷在线播放| 欧美成人dvd在线视频| 男女男精品视频网| 男女性高潮免费网站| 亚洲国产精品高清久久久| 欧美1级2级| 自拍偷拍一区二区三区| 岛国av在线一区| 69亚洲精品久久久蜜桃小说| 北条麻妃在线一区二区| 97一区二区国产好的精华液| 日本精品一区在线观看| 国产精品久久久久久久久免费桃花| av天堂一区二区三区| 国产69精品久久久久久| 日韩免费一区| 亚洲自拍偷拍精品| 欧美色网一区二区| 福利在线导航136| 亚洲一区二区高清视频| 丰满白嫩尤物一区二区| 天堂网视频在线| 欧美日韩国产成人| 凹凸成人精品亚洲精品密奴| 最新日本中文字幕| 欧美羞羞免费网站| 国产第一页在线| 亚洲区一区二区三区| 成人av网站免费|