對Flutter的一些看法


Flutter發布的時候可謂很轟動,相對於RN或PhoneGap們,它給出了另外一種跨平台方案,更像是APP版的Unity,而且使用現代的聲明式UI,據說能媲美原生性能。很吸引人,所以今天特地了解了一下。

Flutter自己實現了布局和2D圖形引擎,不依賴平台提供。實際體驗來看,在安卓平台完全和原生性能相當,在iOS平台與原生相比還是稍稍能感受到一些不同,主要體現在滾動和動畫方面。相信大家都聽說過Flutter對應安卓開發意味着什么,網上有很多關於安卓的討論。本文將以iOS開發者的視角來看待Flutter。

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

 

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一個全新的跨平台方案,性能問題解決后,其他都不是問題。(完)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM