この記事はFlutter Advent Calendar 2023のシリーズ3 24日目の記事です。
今年5月にリリースされたFlutter 3.10で、iOSのデフォルトの描画エンジンがImpellerに切り替わった、という発表がありました。1 Androidも対応するかな?と思いつつ気づけば年末になってしまいましたね。
今回はImpellerについて軽くまとめつつ、AndroidにおけるImpeller対応状況を調べてみます。
Impellerについて
ImpellerはFlutterの新しい描画エンジンです。
元々FlutterではSkiaという描画エンジンを採用していたのですが、このエンジンの欠点として、初回のアニメーション表示がカクつくという問題があります。2 これは、実行時にコンパイルを行うことによって引き起こされる問題です。事前にコンパイルを行うためのSkSL warmup手法も用意されているのですが、ビルド毎、リリース毎に書き出しを行う必要があり手間がかかります。
Impellerはビルド時にコンパイルすることでパフォーマンスへの影響を抑えています。3
各プラットフォームの対応状況
iOS
表題で述べた通り、iOSではFlutter 3.10からデフォルトの描画エンジンがImpellerに移行しています。
MacOS
MacOSは現状プレビュー版です。以下をInfo.plistに追加すると有効化できます。ここも気になる部分ですが割愛します。
<key>FLTEnableImpeller</key> <true />
Android
さて、本題であるAndroidの対応状況です。
執筆時点での最新版であるFlutter 3.16ではプレビューとして、VulkanがサポートされているAndroid端末で利用可能と書かれています。
As of Flutter 3.16, Impeller is available behind a flag on Android devices that support Vulkan
...あれ?Vulkanがサポートされていない端末では使用できないのか?と疑問になるかと思いますので、確認していきます。
バックエンド処理について
AndroidのImpellerの処理は以下で書かれています。
VulkanがサポートされていないAndroid端末ではOpenGL ESで動作するようになっています。さらによく見ると、「Android 10(API 29)以上で、Vulkanのバージョンが1.1、かつExtensionsがサポートされている場合」にVulkanを使用するようです。
公式としては、古いVulkanのサポートはコストがかかるため対応せず、OpenGL ESの処理を改善するようですね。この辺りの安定度の向上のためプレビュー期間が長くなるという想定もされています。4 5
Android端末のVulkanのサポート確認
Android端末のVulkanのバージョン確認方法はいくつかあります。
手っ取り早いのは、vulkan.gpuinfo.orgで検索することです。
Pixelで検索すると以下のバージョンが出てきます。API Versionが対応しているバージョンになります。
デバイス名がわからない場合、実機がある場合は以下のアプリでも確認ができます。ただしAndroid 12以上という要件があるため使えない機種も多そうです。
https://play.google.com/store/apps/details?id=de.saschawillems.vulkancapsviewer
また、以下のissueのログを見ると、実行時にVulkan非対応時にエラーが出るようですね。実際に私が持っているいくつかの古いスマホでも、試したところ同じログが表示されていました。
有効化方法
実行時に--enable-impeller
オプションで有効化もできますが、以下のようにAndroidManifest.xml
に記述すると有効にできるため、こちらが楽かと思います。
<meta-data android:name="io.flutter.embedding.android.EnableImpeller" android:value="true" />
終わりに
今回はAndroidのImpeller対応状況をまとめました。現在は既知のバグも多く、まだまだ対応中という印象ですが、今後の動向に注目したいところです。気になる方は有効にして動作を確認してみたり、バグ報告してみるといいかもしれませんね👍
参考
Impeller rendering engine | Flutter
engine/impeller/docs/android.md at main · flutter/engine · GitHub
Flutterの課題、Early-onset jankとは何か
Impeller engine: is it good enough for Flutter? | Medium
- What’s new in Flutter 3.10. Seamless web and mobile integration… | by Kevin Chisholm | Flutter | Medium↩
- https://zenn.dev/mjhd/articles/e5e10de56eba50↩
- Predictable performance: Impeller compiles all shaders and reflection offline at build time. It builds all pipeline state objects upfront. The engine controls caching and caches explicitly.↩
- Impeller could theoretically support older version of Vulkan but at a significant cost of implementation and for ultimately diminishing returns on investment. The team would rather spend that time improving the OpenGL ES backend.↩
- However, compared with iOS, the Android hardware ecosystem is much more diverse, and we anticipate a longer preview period for Android than for iOS before making it the default backend on the stable channel.↩