對Flutter的一些見解

Flutter發佈的時候可謂很轟動,相對於RN或PhoneGap們,它給出了另一種跨平臺方案,更像是APP版的Unity,並且使用現代的聲明式UI,聽說能媲美原生性能。很吸引人,因此今天特意瞭解了一下。html

Flutter本身實現了佈局和2D圖形引擎,不依賴平臺提供。實際體驗來看,在安卓平臺徹底和原生性能至關,在iOS平臺與原生相比仍是稍稍能感覺到一些不一樣,主要體如今滾動和動畫方面。相信你們都據說過Flutter對應安卓開發意味着什麼,網上有不少關於安卓的討論。本文將以iOS開發者的視角來看待Flutter。git

在iOS平臺,利用高效的CoreAnimation和獨立進程渲染服務來呈現內容,這是構建性能卓越的原生應用的軟件基礎。我比較關心性能,一個新技術的出現,若是使用戶體驗開了倒車,那這門新技術普及的可能就很是小了。因此咱們先來看看Flutter是如何呈現內容的:github

 

Flutter engine提供了圖形服務、文件IO以及事件等核心功能。性能優化

由上圖能夠看出繪製管線主要發生在UI任務運行器(UI Task Runner)和GPU任務運行器(GPU Task Runner)上,這2個運行器一般分別跑在各自的線程上。架構

下面是官方文檔的UI任務運行器解釋:佈局

  • 根隔離必須告訴引擎須要渲染幀。
  • 引擎將詢問平臺應該在下一個vsync上通知它。
  • 該平臺等待下一個vsync。
  • 在vsync上,引擎將喚醒Dart代碼並執行如下操做
    • 更新動畫插值器。
    • 在佈局階段重建應用程序中的widgets。
    • 佈置新構造的widgets並將它們繪製成當即提交給引擎的圖層樹。這裏沒有任何實際的柵格化; 只有對須要繪製的內容的描述是做爲繪製階段的一部分構建的。
    • 在屏幕上構造或更新包含有關widgets的語義信息的節點樹。這用於更新平臺特定的輔助功能組件。

UI任務運行器主要處理圖層佈局相關,調用dramFrame重建窗口圖層樹中的全部髒元素等,這裏的過程和CALayer的drawInContext很是類似。性能

而Skia圖形庫和TextLayout等發生在GPU任務運行器裏,GPU任務運行器會負責一些GPU操做相關的工做,相似於iOS平臺的獨立渲染服務。測試

咱們和UIKit比較,Flutter沒有像UILabel那樣沒法在後臺線程排版的問題,總體架構也是面向高性能UI而構建的,那麼爲何還有不少性能差別呢。其實也不奇怪,拋開VM和原生機器碼的性能差別,蘋果在優化方面是精益求精的和有平臺針對性的,可能永遠也不會比CoreAnimation性能更好。但Flutter是爲跨平臺而生的,並且尚處於Bate階段,運行時VM以及圖形渲染和動畫基礎結構都有很是多的性能優化空間,若是開發者參與度高或者Google開掛扶持,相信改善會很是快。優化

咱們再來看看Flutter的總體架構:動畫

主要分爲Dart的Framwork層、C++的引擎層以及平臺相關的嵌入層。可見理論上只要適配嵌入層就可讓Flutter在任何系統上運行。

實際測試發現,在iOS平臺實際啓動時仍是會先跑完整的原生應用冷啓動過程,完了再去啓動Flutter系統包括註冊Dart VM等,仍是比較耗時的,播放完開機畫後會有一段時間的黑屏,我想應該能夠經過原生殼來掩蓋黑屏改善體驗,固然也期待能優化後能讓冷啓動過程速度更快一些。

總結來看,仍是至關看好的,對於Flutter一個全新的跨平臺方案,性能問題解決後,其餘都不是問題。(完)

相關文章
相關標籤/搜索