Flutter效能監控工具(2)— Performance Overlay

小德_koudle發表於1970-01-01

0x00 前言

Performance Overlay是在app上顯示效能統計資料的浮窗。

0x01 Performance Overlay

如下圖:

Flutter效能監控工具(2)— Performance Overlay

這個浮窗有兩個圖形:

  1. 上面的是GPU thread

    表示在GPU執行緒上生成每幀需要的時間。

  2. 下面的UI thread

    表示在UI執行緒上生成每幀需要的時間。

每個圖形繪製的都是該執行緒最後300幀的資料。

為了保證60FPS,每幀耗費的時間應該是小於16ms的,看上圖中綠色的粗線條,代表的是當前幀的資料,如果當前幀的資料符合預期(<
16ms),那麼就是綠色的,如果不符合,就是紅色的,如下圖:

Flutter效能監控工具(2)— Performance Overlay

遇到紅色的就需要去具體分析,因為會造成APP卡頓:

  1. 如果GPU thread是紅色的

    那麼可能是繪製的圖形過於複雜,或者是執行了過多的GPU操作。

  2. 如果UI thread是紅色的

    說明肯定是Dart程式碼裡有耗時操作,導致阻塞了UI操作。

  3. 如果兩個都是紅色的建議從UI thread,也就是Dart程式碼查起。

0x02 GPU問題定位

  1. 一些效果儘量設定在子Widget上,而不是父Widget

例如,要實現一個混合圖層的半透明效果,如果把透明度設定在頂層Widget上,CPU會把每個子Widget的圖層渲染出來,在執行saveLayer操作儲存為一個圖層,最後給這個圖層設定透明度,但是saveLayer的開銷很大,所以官方給出建議:首先確認這些效果是否真的有必要;如果有必要,應該把透明度設定到每個子Widget上,而不是父Widget。裁剪操作也是類似。

  1. 影像快取

還有一個拖慢GPU渲染速度的是沒有給靜態影像做快取,導致每次build都會重新繪製。我們可以把靜態影像加到RepaintBoundry中,引擎會自動判斷影像是否複雜到需要repaint boundary。

  1. 開啟saveLayer和影像快取的檢查
MaterialApp(    showPerformanceOverlay: true,    checkerboardOffscreenLayers: true, //使用了saveLayer的影像會顯示為棋盤格式並隨著頁面重新整理而閃爍    checkerboardRasterCacheImages: true, // 做了快取的靜態影像圖片在重新整理頁面使不會改變棋盤格的顏色;如果棋盤格顏色變了,說明被重新快取,這是我們要避免的    ...);
複製程式碼

0x03 UI問題定位

可以使用 Observatory裡的timeline的功能分析。

0x04 如何開啟Performance Overlay

開啟Performance Overlay的方法有三種:

1、 Flutter Inspector

Flutter Inspector是一個強大的工具,Performance Overlay的功能也整合在Flutter Inspector裡。

需要我們執行Flutter APP後才可以使用,

  1. 在Android Studio裡

選擇 View >
Tool Windows >
Flutter Inspector,就可以開啟Flutter Inspector,可以看到有很多功能,如下圖:

Flutter效能監控工具(2)— Performance Overlay

然後選擇Performance Overlay。

  1. 在VS Code裡

通過 View >
Command Palette 或者 cmd+p開啟命令板,輸入“performance” 然後選擇 Toggle Performance Overlay 就行。

2. 使用程式碼設定

將 MaterialApp 或者 WidgetsApp 的showPerformanceOverlay 屬性設定為true,如下:

class MyApp extends StatelessWidget { 
@override Widget build(BuildContext context) {
return MaterialApp( showPerformanceOverlay: true, title: 'My Awesome App', theme: ThemeData( primarySwatch: Colors.blue, ), home: MyHomePage(title: 'My Awesome App'), );

}
}複製程式碼

來源:https://juejin.im/post/5c4d3ef66fb9a049b13e95b7

相關文章