Flutter 3のパフォーマンス改善まとめ
参考: https://medium.com/flutter/whats-new-in-flutter-3-8c74a5bc32d0
-
部分再描画のAndroid適用 (flutter/engine#29591)
- 端末が対応してる場合、画面全体を更新せずに変化のあった領域だけ更新されるようになる
- Pixel 4 XLのベンチマークで平均, 90th, 99th共にRasterが5倍ぐらい早くなった
- iOSは既に2.10で適用済み (flutter/engine#28801)
- 古めの端末だと未対応かも?
-
SaveLayerの自動削減 (flutter/engine#30957, flutter/engine#29775, Issue: flutter/flutter#92874)
- 例えばOpacityの中に簡単な図形しかない場合SaveLayerコマンドが本来不要。なので削減した
- 他の複雑なケースも引き続き削減していきそう
- ベンチマーク見ると10倍以上早くなってそう… (flutter/flutter#97336 (comment), https://flutter-flutter-perf.skia.org/e/?begin=1643063115&end=1644004520&keys=X32827d8819e8271e025f50e77bf2bec0&requestType=0&xbaroffset=27447)
- 例えばOpacityの中に簡単な図形しかない場合SaveLayerコマンドが本来不要。なので削減した
-
Raster/UIスレッドの優先度が他のスレッド(GCとか)より高くなった
- 〜20%ほどのフレームレートの改善
-
Rasterのキャッシュの精度が良くなった (flutter/engine#31417)
- 今までは描画コマンド数でキャッシュするか決めていたが、描画コマンドのコストを試算して決めるようになった
- メモリ使用量の改善
-
iOSでフレームレートが落ちるバグが改善された (flutter/engine#31513)
- CupertinoPageRouteのバックスワイプで戻る最中、フレームレートが落ちる問題
- ListViewのカクツキも改善した
-
ImpellerというiOSの描画バックエンドが実験的に入った( https://github.com/flutter/engine/tree/main/impeller )
--enable-impeller
で有効になる- iOSのカクツキの大きな原因として実行中のシェーダーのコンパイル処理があったが、汎用的なシェーダーを事前にビルドしてエンジンに入れとく
- Galleryアプリが(ワーストケースで)20倍早くなったらしい