1,、什么是渲染引擎?
用戶界面(UI)由Flutter引擎渲染并顯示在屏幕上,,該引擎是Flutter框架的基礎(chǔ)元素。它維護(hù)一個(gè)呈現(xiàn)對(duì)象樹,,比如小部件和布局,,這些對(duì)象負(fù)責(zé)定義它們自己的布局、繪制它們的可視化表示和處理輸入事件,。
Flutter中的渲染引擎執(zhí)行兩個(gè)主要過程:布局和繪制,。在布局階段,引擎分析呈現(xiàn)的對(duì)象樹,,以根據(jù)父元素提供的約束確定每個(gè)元素或?qū)ο蟮拇笮『臀恢?。布局階段完成后,引擎再次分析樹,,指示每個(gè)渲染對(duì)象將自己繪制到畫布上,。
Flutter的渲染引擎通過減少不必要的重繪和使用硬件加速來最大限度地提高性能。這允許高性能的圖形渲染和流暢的動(dòng)畫,。Flutter使開發(fā)人員能夠使用渲染引擎的功能為各種平臺(tái)和設(shè)備創(chuàng)建快速和動(dòng)態(tài)的用戶界面,。
然而,盡管所有這些在理論上看起來都很奇妙和令人興奮,,但在實(shí)踐中已經(jīng)證明,,目前的Flutter引擎(Skia)在iOS上的著色器編譯方面存在一些問題,。當(dāng)應(yīng)用程序第一次啟動(dòng)時(shí),著色器被緩存,,需要第一次編譯,,就會(huì)出現(xiàn)這個(gè)問題。這在速度較慢的手機(jī)上尤為明顯,。
2,、來了解一下 Skia是什么? Skia是一個(gè)用c++編寫的開源2D圖形庫。為了保持多平臺(tái)性,,Skia支持多個(gè)(依賴于平臺(tái)的)后端,。這些包括: CPU軟件柵格化(將用矢量圖形格式(形狀)描述的圖像轉(zhuǎn)換為柵格圖像的任務(wù)) 可攜式文件格式(PDF) 輸出gpu加速渲染使用:-幾乎原生圖形層引擎(ANGLE)支持,它將OpenGL ES調(diào)用轉(zhuǎn)換為供應(yīng)商的原生api Vulkan和Metal,。 可縮放矢量圖形(SVG)
當(dāng)Flutter用于渲染的Skia圖形后端第一次看到一個(gè)新的繪制命令序列時(shí),它有時(shí)會(huì)為該命令序列生成并編譯一個(gè)自定義GPU著色器,。這允許該序列和潛在的類似序列盡可能快地渲染,。
不幸的是,Skia的著色器生成和編譯與幀工作負(fù)載順序發(fā)生,。編譯可能花費(fèi)幾百毫秒,,而對(duì)于60 fps(幀/秒)的顯示,需要在16毫秒內(nèi)繪制平滑幀,。因此,,編譯可能會(huì)導(dǎo)致數(shù)十幀丟失,并將fps從60降至6,。這是匯編,。編譯完成后,動(dòng)畫應(yīng)該是流暢的,。 Impeller 是 Flutter 為了治理 SkSL 編譯耗時(shí)引入的的性能問題所做的重要嘗試,,Skia 的渲染機(jī)制需要在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建 SkSL,導(dǎo)致著色器編譯的時(shí)間后移,, Impeller 通過在編譯期完成 GLSL 至 MSL 的轉(zhuǎn)換,, Impeller 作為 Flutter 獨(dú)占的渲染方案, 沒有 Skia 的歷史負(fù)擔(dān),, 更容易充分利用 Apple 的技術(shù)優(yōu)化,,這意味著 Impeller 的性能表現(xiàn)還有進(jìn)一步提升的可能。
|