亞寵展、全球寵物產業風向標——亞洲寵物展覽會深度解析
1000
2022-05-30
在衡量性能時,應用程序中的渲染動畫一直是最受關注的話題之一。由于 flutter 自帶的 Skia 引擎以及它能夠快速創建和處理組件的能力, Flutter 應用在默認情況下就能保證擁有良好的性能,因此我們只需避開常見的陷阱就可以獲得出色的性能。
有幾種常見的陷阱:
每幀重建的 UI 比預期的要多得多。要跟蹤組件的重建,
直接構建大量的子組件列表,而不使用 ListView。
顯示性能數據
在 Debug 模式下啟動應用后,使用 View > Tool Windows > Flutter Performance 打開性能工具窗口,以查看性能數據以及 widget 的 rebuild 信息。
點擊 Performance 窗口中的 Show widget rebuild information,查看正在重載的 widget 統計信息和重載頻率。右邊第二列顯示了所在框架的重載次數。如果重載次數過多,會顯示一個黃色旋轉圓圈。最右一列顯示了進入當前頁面后 widget 的重載次數。對于未重載的小部件,將顯示一個灰色圓圈,否則將顯示一個灰色旋轉圓圈。
截圖中的應用性能較差,通過重載分析器,你可以找到導致性能差的線索。重載分析器不是一個性能診斷工具,但它和性能有關。
該功能的目的是讓你了解 widget 是何時重載的,只看代碼的話可能不好發現。如果 widget 在你預想不到的情況下發生了重載,說明你可能需要重構代碼,將大型的構建方法拆分成多個 widget。
該工具可以幫助你調試至少四個常見的性能問題:
整個屏幕(或大部分屏幕)由一個 StatefulWidget 構成,導致不必要的 UI 構建。可將 UI 拆分成多個具有較輕量 build() 方法的 widget。
未在屏幕上顯示的 widget 發生了重載。例如,一個延伸到屏幕外的 ListView,或者未給延伸到屏幕外的列表設置 RepaintBoundary,會導致重繪整個列表。
AnimatedBuilder 的 build() 方法繪制了一個不需要動畫的子樹,導致不必要的靜態對象重載。
一個 Opacity widget 在 widget tree 中使用了一個不必要的高度,或者通過直接操作 Opacity widget 的透明屬性創建 Opacity 動畫,導致 widget 和它的子樹重載。
你可以點擊表格中的一行,定位到創建指定 widget 的源碼位置。隨著代碼的運行,旋轉圖標也會在代碼窗口中顯示,以幫助你觀察正在進行的重載。
大量的重載并不一定表示存在問題。通常情況下,只有當你通過分析發現性能不理想時,才需要考慮過度重載的問題。
記住,widget 的重載信息只在 debug 版本中可用,在真機上使用分析構建 (profile build) 進行應用性能分析,使用調試構建 (debug build) 進行性能問題調試。
提示和技巧
Flutter的幾個性能指標
第一幀的啟動時間
當 WidgetsBinding.instance.firstFrameRasterized 為 true 時查看耗時。
查看 性能數據看板。
一幀的構建時間,柵格化時間,以及總時間
在 API 文檔中查看 FrameTiming 。
一幀的構建時間 buildDuration (*_frame_build_time_millis)
我們建議監測四個數據:平均值、90 分位值、99 分位值和最差幀構建時間。
例如,查看 flutter_gallery__transition_perf 測試案例中的 構建數據 。
一幀的柵格化時間 rasterDuration (*_frame_build_time_millis)
我們建議監測四個數據:平均值、90 分位值、99 分位值和最差幀構建時間。
例如,查看 flutter_gallery__transition_perf 測試案例中的 柵格化數據 。
CPU/GPU 的使用情況(一個可以近似衡量功耗的指標)
該數據目前僅能通過跟蹤事件獲取。查看 profiling_summarizer.dart 。
查看 simple_animation_perf_ios 測試案例中的 CPU/GPU 數據。
release_size_bytes 對 Flutter 應用程序的大小進行估算
查看數據看板中的 體積大小 數據。
有關如何更精確的測量應用體積信息,查看 應用體積 頁面。
減少應用大小
刪除無用的資源
盡量減少從庫中引入的資源
壓縮 PNG 和 JPEG 文件
so 優化大法
混淆
Flutter
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。