国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

如何讓 Flutter 應(yīng)用更好地使用 SVG?

開(kāi)發(fā) 開(kāi)發(fā)工具
本文將帶大家了解 SVG 在 Flutter 應(yīng)用中的性能問(wèn)題,分享 UC 瀏覽器內(nèi)核技術(shù)團(tuán)隊(duì)在 Flutter 應(yīng)用中改進(jìn) SVG 應(yīng)用的探索實(shí)踐。

SVG 作為一個(gè)強(qiáng)大的矢量圖標(biāo)準(zhǔn)格式,在圖片清晰度的表現(xiàn)力上有著位圖無(wú)法比擬的優(yōu)勢(shì)。那么是否 SVG 就是絕對(duì)的首選了呢?事實(shí)可能并非如此。本文將帶大家了解 SVG 在 Flutter 應(yīng)用中的性能問(wèn)題,分享 UC 瀏覽器內(nèi)核技術(shù)團(tuán)隊(duì)在 Flutter 應(yīng)用中改進(jìn) SVG 應(yīng)用的探索實(shí)踐。

例說(shuō)歷史

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

??

??

 

 

如果這個(gè) 5kB 用 PNG 來(lái)存儲(chǔ)的圖片,是下圖這個(gè)樣子。

??

??

表現(xiàn)力天差地別。

為了達(dá)到類似的清晰度,一般操作系統(tǒng)會(huì)協(xié)助應(yīng)用打包時(shí)在 UI 資源中歸集多個(gè)分辨率的圖片。

??

??

32x32

 

??

??

64x64


 

??

??

256x256

 

 

??

??

1024x1024

 

上面這一個(gè)圖標(biāo),資源包占用超過(guò) 120kB,其中最大的一個(gè)版本,運(yùn)行內(nèi)存占用在 4MB。

這么看來(lái),SVG 圖片應(yīng)該是絕對(duì)首選吧?

并非如此。在給 Flutter 做 SVG 支持分析之前,開(kāi)發(fā)者可能覺(jué)得各個(gè)移動(dòng)系統(tǒng) API 中沒(méi)有提供是個(gè)很大缺憾。

而經(jīng)過(guò)光柵化代價(jià)數(shù)據(jù)分析后,也能理解了系統(tǒng)對(duì)盲目使用 SVG 帶來(lái)問(wèn)題的擔(dān)憂。

比如還是上面這個(gè) SVG 圖片,在驍龍 626 的手機(jī)上,F(xiàn)lutter 光柵化到 64x64 的區(qū)域需要 34ms,一個(gè) SVG 讓應(yīng)用與 60 幀流暢度徹底無(wú)緣。實(shí)測(cè) IPhone X 需要 8ms,只能流暢顯示兩個(gè)。

另外補(bǔ)充一點(diǎn),SVG 或者說(shuō)矢量圖的應(yīng)用需求是 UI 扁平化趨勢(shì)興起后才出現(xiàn)的。在擬物化的時(shí)期,拋開(kāi)光柵化速度不說(shuō),矢量圖在顯示寫實(shí)風(fēng)格的圖標(biāo)時(shí),缺陷是無(wú)法容忍的。比如 doggy,用較激進(jìn)的追蹤矢量化后(右側(cè)),已經(jīng)數(shù)碼感十足,存儲(chǔ)占用也遠(yuǎn)超 PNG。

??

??

好在,扁平化的矢量圖在工程推進(jìn)時(shí),也在有意無(wú)意回避前面說(shuō)的問(wèn)題,大部分都走簡(jiǎn)約風(fēng)。所以只要避開(kāi)陷阱,SVG 還是在很多場(chǎng)景可以做到表現(xiàn)優(yōu)秀的。

應(yīng)用現(xiàn)狀

Flutter 項(xiàng)目主線沒(méi)有支持

Flutter 的基礎(chǔ)組件 Skia 代碼中有 SVG 目錄,但別誤會(huì)了,Skia 只有序列化至 SVG 的功能,沒(méi)有解碼繪制 SVG 的能力。

框架開(kāi)發(fā)計(jì)劃目前也沒(méi)有支持的打算:https://github.com/flutter/flutter/issues/1831

OS 也沒(méi)有支持的意向

這是可以理解的,因?yàn)辇嫶笕?Android 和 iOS 也默認(rèn)不支持:

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

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

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

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

雖然在 SVG 投入不少研究,也不得不承認(rèn),字體矢量圖輸出是目前很務(wù)實(shí)高效的方案。

配合工具流程改進(jìn) SVG 應(yīng)用

SVG 作為一個(gè)強(qiáng)大的矢量圖標(biāo)準(zhǔn)格式,還是可以找到合適的應(yīng)用的。比如多彩圖標(biāo),方便熱更新,生產(chǎn)工具對(duì)此格式的廣泛支持。

讓 SVG 再次偉大

在 OS 和 runtime 都拋棄 SVG 的情況下,flutter_svg 包毅然然扛起大旗,簡(jiǎn)單快捷的給 Flutter 提供了 SVG 渲染解碼的能力,顯示出 Flutter/Dart 不俗的擴(kuò)展?jié)撃堋?/p>

flutter_svg 的使用非常簡(jiǎn)單,提供和 flutter framework 中 image_provider 類似的接口。下面兩段代碼就是分別顯示來(lái)自 asset 和網(wǎng)絡(luò)的 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()),
),

用工具避坑

不能對(duì) SVG 的性能隱患坐視不理。

UC 瀏覽器內(nèi)核技術(shù)團(tuán)隊(duì)開(kāi)發(fā)了一個(gè)【資源面板】工具,可以方便地連接 Flutter 應(yīng)用,實(shí)時(shí)顯示資源分配的內(nèi)存,對(duì)其中的 SVG 圖片,資源面板提供了預(yù)覽和獲取光柵化損耗的功能。

??

??

通過(guò)記錄和對(duì)比 SVG 在實(shí)際移動(dòng)設(shè)備上的光柵化損耗,我們可以方便地識(shí)別出有隱患的 SVG 文件,將 SVG 的應(yīng)用安排妥當(dāng)。

??

??

通過(guò)實(shí)際 Rasterization Cost 的對(duì)比可以看到,簡(jiǎn)約風(fēng)格的圖標(biāo),時(shí)間消耗到 16.66ms 來(lái)說(shuō)在驍龍 626 上也還是可以接受的。

實(shí)現(xiàn)原理

flutter_svg

flutter_svg 是一個(gè) dart package,提供解析來(lái)自 network、asset、memory 等 SVG 的能力。

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

ui.Picture 類占用的內(nèi)存不會(huì)很大,緩存基本上是為了避免反復(fù) parse xml。

比如 SvgPicture.asset 的構(gòu)造接口如下:

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 由 來(lái)自 pictureCache 的 completer 填充 ui.Picture 。

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

Debug 和 Profile 模式下,通過(guò)添加配合代碼,開(kāi)發(fā)者工具可以在 PictureCache 中查詢所有現(xiàn)存的 SvgPicture 。

光柵化時(shí)間獲取

光柵化的發(fā)起接口是 ui.Picutre.toImage 方法,具體的計(jì)時(shí)在 rasterizer 線程。

??

??

??

??

補(bǔ)充說(shuō)明

Android VectorDrawable

Android 提供了一套 VectorDrawable 方案,是一個(gè)簡(jiǎn)化版的 SVG , 格式和特性不完全兼容,提供轉(zhuǎn)換工具。從文檔來(lái)看,確實(shí)是擔(dān)心過(guò)度復(fù)雜的 SVG 影響性能。參考文檔:https://developer.android.com/studio/write/vector-asset-studio

單獨(dú) SVG 位圖緩存優(yōu)化

目前 Flutter 用的是一次性光柵化輸出每幀的模式,和 chromium 的 cc 按區(qū)域構(gòu)建位圖再合成不同,如果在光柵化輸出時(shí)標(biāo)記 SVG 的 Picture,緩存這部分位圖可以提升幀數(shù),代價(jià)當(dāng)然是內(nèi)存損耗。

這個(gè)功能目前純用 Dart 無(wú)法方便實(shí)現(xiàn),因?yàn)樵?dart.ui 線程中,RenderPicture 無(wú)法預(yù)見(jiàn)具體的光柵化分辨率。

 

責(zé)任編輯:武曉燕 來(lái)源: 51CTO專欄
相關(guān)推薦

2021-02-25 22:17:19

開(kāi)發(fā)技術(shù)編程

2018-10-11 09:40:53

前端JavaScript編程語(yǔ)言

2019-03-22 14:20:26

管理多云云計(jì)算

2013-05-02 14:39:11

iOS開(kāi)發(fā)iOS應(yīng)用崩潰解決

2022-09-12 23:53:53

JavaScript條件判斷開(kāi)發(fā)

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

數(shù)據(jù)中心監(jiān)控

2015-08-21 10:38:26

DaaS

2014-10-29 09:55:58

程序員代碼

2021-01-28 14:53:19

PHP編碼開(kāi)發(fā)

2017-10-12 15:20:57

數(shù)據(jù)中心遷移數(shù)據(jù)云端

2022-05-06 15:58:44

物聯(lián)網(wǎng)社區(qū)物聯(lián)網(wǎng)應(yīng)用

2022-05-05 16:49:12

物聯(lián)網(wǎng)社區(qū)應(yīng)急

2011-07-19 09:22:20

活動(dòng)目錄

2015-03-12 15:00:00

編程12條自問(wèn)更好地編程

2012-12-20 09:46:42

應(yīng)用虛擬化

2023-11-09 11:48:41

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国内精品卡一卡二卡三新区| 丝袜美腿美女被狂躁在线观看| 亚洲三级网站| 欧美激情啊啊啊| 91超碰在线播放| 欧美日韩精品欧美日韩精品一 | 精品国产91九色蝌蚪| 国产女人在线观看| 午夜精品aaa| 在线看国产视频| 亚洲国产日韩精品| 九色porny在线观看| 亚洲最大成人综合| 黄色三级电影网站| 亚洲激情男女视频| 美臀av在线| 欧美性猛交xxxx免费看| 在线黄色av| 大伊人狠狠躁夜夜躁av一区| 一区二区三区视频国产日韩| 欧美丝袜美女中出在线| 国产福利电影在线| 日韩欧美高清一区| 91av久久| zzijzzij亚洲日本成熟少妇| 精品国产三区在线| 日韩av片永久免费网站| 欧美wwwww| 国产99视频精品免费视频36| 91久久夜色精品国产九色| 欧美激情导航| 国产在线视视频有精品| 人妻有码中文字幕| 亚洲精品国产视频| 每日更新在线观看av| 91麻豆精品国产综合久久久久久| 污污的视频在线观看| 亚洲欧美中文日韩在线v日本| 成人福利一区二区| 欧美一级片在线播放| 欧美一区二区三区另类 | www.av中文字幕| 国产精品国产三级国产普通话蜜臀 | 日本免费不卡一区二区| 国产精品婷婷午夜在线观看| 香蕉自在线视频| 91精品国产综合久久婷婷香蕉| 中文不卡1区2区3区| 九九精品在线视频| 日韩中文欧美| 午夜精品区一区二区三| 久久综合久久综合久久综合| 最近中文字幕在线| 亚洲成人精品视频在线观看| 国产精品久久久久久久久久久久久久久| 日本久久久久久久久久久| 韩日视频一区| 精品国产一二三四区| 午夜国产不卡在线观看视频| 国产va在线视频| 国产成人精品av| 日本系列欧美系列| 久久久国产欧美| 欧美精品一级二级三级| 亚洲乱码一区| 久久精品国产一区二区三区不卡| 91社区在线播放| 在线看的av网站| 欧美大片欧美激情性色a∨久久| 欧美成熟视频| 日日碰狠狠躁久久躁婷婷| 色国产综合视频| 亚洲精品无播放器在线播放| 国内精品一区二区| 国产精品久久久久aaaa樱花| 牛牛电影国产一区二区| 国产精品伦子伦免费视频| 国产成人综合在线观看| 天堂影院在线| 欧美成人免费va影院高清| 亚洲视频播放| 2023欧美最顶级a∨艳星| 中文日韩在线观看| 国产欧美一区二区色老头| 美女视频免费观看网站在线| 在线欧美日韩国产| 97人人精品| 久久天天躁狠狠躁老女人| 91精品二区| 97视频在线免费播放| 在线观看亚洲一区| 北条麻妃一区二区三区在线| 欧美日韩三区四区| 精品久久久久人成| 视频精品二区| 亚洲一区二区高清视频| 亚洲大型综合色站| 成人av在线播放| 一级特黄录像免费播放全99| 精品久久久免费| 国产+成+人+亚洲欧洲在线| 在线免费观看一区二区三区| 91激情五月电影| 精品久久视频| 亚洲色图久久久| 亚洲网址你懂得| 亚洲综合欧美| 国产精品无码2021在线观看| 国产成人精品av在线| 91在线观看高清| **欧美日韩在线观看| 欧美精品成人一区二区在线观看 | 7777精品伊人久久久大香线蕉| 国产成人手机高清在线观看网站| 一女被多男玩喷潮视频| 日韩黄在线观看| 日韩国产高清影视| a级片国产精品自在拍在线播放| 亚洲精品久久7777| 日韩高清电影一区| 日韩av在线第一页| 中文字幕制服丝袜在线| 国产欧美日韩精品专区| 国产午夜精品美女毛片视频| 成人情趣视频| 老司机99精品99| 日本中文在线| 国产精品视频yy9099| gogogo免费视频观看亚洲一| 国产一二三在线| 精品在线不卡| 欧美日韩成人综合天天影院| 欧美特黄一级| 在线视频自拍| 免费看成人片| 精品国产三级a在线观看| 久久中文在线| 成年网站在线视频网站| 亚洲精品影院| 国产手机视频精品| 国产成人小视频| 成人豆花视频| 国产一二三视频| 国产在线视频欧美| 欧美日韩国产另类一区| 日韩精品电影在线| 午夜精品久久久久久久久久蜜桃| 亚洲一区av在线| 国产精品久久久网站| 橘梨纱av一区二区三区在线观看| 国产精品成av人在线视午夜片| 精品国产福利视频| 中文一区二区| 亚洲女同av| 在线免费av播放| 成人字幕网zmw| 日韩欧美黄色影院| 99国产精品久久久久久久久久| av毛片精品| 深夜影院在线观看| 日韩av影视| 久久夜色撩人精品| 国产另类ts人妖一区二区| 国产精品亚洲一区二区三区在线 | 欧美高清在线观看| 校园春色亚洲| 国产精品区一区二区三在线播放| 国产日韩精品入口| 日韩av色在线| 国模无码大尺度一区二区三区| 欧美日韩水蜜桃| 国产一级成人av| 成黄免费在线| 台湾成人av| 亚洲自拍偷拍网址| 亚洲第一成人在线| 亚洲无线视频| 成人影院av| 亚洲成人av免费看| 欧美在线色视频| 亚洲人成久久| 成年美女黄网站色大片不卡| 免费国产黄色网址| 欧美性受xxxx黑人猛交| 日韩欧美国产成人| 国产一区二区福利视频| 粉嫩精品导航导航| www.亚洲资源| 日韩精品一区二区免费| 国产成人精品av在线| 欧美一区二区三区免费视频| 成人黄色777网| 伊人久久大香线| 欧美视频在线视频精品| 色视频精品视频在线观看| av动漫在线播放| 亚洲字幕在线观看| 久久久久久亚洲精品| 欧美不卡视频一区| 国产精品盗摄一区二区三区|