ImpellerはFlutter用の最新レンダリングエンジンであり、GoogleがSkiaを置き換え、その根本的な問題(最初のフレームレンダリング時のシェーダージャンク、高いメモリ消費、さまざまなグラフィックスバックエンドのサポートの複雑さ)を解決するために開発しました。Skiaとは異なり、Impellerはシェーダーを事前に(オフラインで)コンパイルし、SPIR-Vを中間表現として使用し、Vulkan、Metal、Direct3D 12と直接動作します。Flutter Team(2025)によると、Impellerはシェーダージャンクの最大95%を排除し、エントリーレベルのデバイスでも予測可能な60 FPSを実現します。
重要なポイント
ImpellerはC++で書かれたオープンソースのグラフィックスレンダリングエンジンであり、FlutterチームがSkiaに代わる主要なレンダラーとして開発しています。このプロジェクトは、Skiaが抱える長年のシェーダージャンク問題への対応として2021年に発表されました。ImpellerはSkiaのフォークではなく、モバイルGPUと最新グラフィックスAPIの制限を考慮して設計された完全に新しい実装です。
Impellerの主なアイデアは、シェーダーのコンパイルを実行時ではなくアプリケーションのビルド段階に移行することです。Skiaでは、シェーダーは最初の使用時に、ユーザーがすでにアプリケーションと対話しているときにコンパイルされます。Impellerはすべてのシェーダーを事前に(オフラインで)コンパイルし、SPIR-Vバイナリ形式にパッケージ化して、アプリケーションと一緒に配布します。実行時にImpellerは事前コンパイルされたシェーダーをロードするため、コンパイルの遅延が発生しません。
Impellerはメモリ消費の問題も解決します。Skiaはレンダリング中に多くの一時オブジェクト(テクスチャ、バッファ)を作成し、リソースが限られたデバイスでメモリの断片化を引き起こします。Impellerはメモリプールを使用し、割り当てられたリソースを再利用することで、ピークメモリ消費を30~40%削減します。
SPIR-V(Standard Portable Intermediate Representation)は、Khronos Groupによって開発されたシェーダーの中間表現です。Impellerはすべてのシェーダーに対してSPIR-Vを普遍的な形式として使用します。ビルド段階で、Impeller言語(エフェクトを記述するためのカスタムC++ DSL)で書かれたシェーダーはSPIR-Vにコンパイルされます。実行時にSPIR-Vがロードされ、プラットフォーム固有の形式(Metal用のMSL、Vulkan用のGLSL、Direct3D 12用のDXIL)に変換されます。
Impellerのアーキテクチャは複数のレイヤーで構成されており、各レイヤーは厳密に定義されたタスク(レンダリングコマンドリストの処理、GPUリソースの管理、シェーダーの実行)を実行します。このモジュール性により、新しいグラフィックスAPIのサポートを容易に追加できます。
最下層はグラフィックスAPI(Vulkan、Metal、Direct3D 12)の抽象化です。ImpellerはOpenGLをサポートしません。OpenGLは効率的なオフラインシェーダーコンパイルの機能を提供しないためです。このレベルでは、頂点バッファ管理、パイプラインの作成とキャッシング、GPU同期が実装されています。Impellerにおけるパイプラインは、シェーダー、ラスタライゼーション設定、ブレンディングを含む事前コンパイルされたGPU状態です。すべてのパイプラインは初期化時に作成され、レンダリング中のコンパイルを排除します。
中間層はリソース管理システムです。GPUリソース(テクスチャ、バッファ、サンプラー)を割り当てて再利用します。毎フレーム新しいテクスチャを作成する代わりに、Impellerはさまざまなサイズと形式のテクスチャのプールを維持します。メモリプールは使用されていないリソースを自動的に返却し、必要に応じて拡張できますが、Skiaに特徴的な断片化は発生しません。
最上層はレンダリンググラフであり、Flutter EngineがCanvas APIコマンドを変換します。ImpellerはDisplay Listを受け取り、そこから操作依存関係グラフを構築します。グラフは最適化され、冗長なレンダーパスが削除され、同じGPU状態の操作がマージされます。その後、グラフは事前に作成されたパイプラインを使用してVulkan/Metal呼び出しのシーケンスにコンパイルされます。
各フレームは固定パイプライン(Display List → レンダリンググラフ → グラフコンパイル → GPUコマンド送信)を通過します。ポストエフェクト(ブラー、シャドウ)やデプスバッファの準備のために追加のパスが追加される場合があります。Impellerのフレーム時間はSkiaよりも予測可能です。シェーダーコンパイルによる非決定的な遅延がないためです。
ImpellerとSkiaの比較は、レンダリングアプローチの違いを示しています。Skiaは汎用の2Dライブラリであるのに対し、ImpellerはモバイルUIの要件に最適化されたFlutter専用のエンジンです。
| パラメータ | Skia | Impeller |
|---|---|---|
| シェーダー | ランタイムコンパイル | オフラインコンパイル(ビルド時) |
| シェーダージャンク | 最初のフレームで50~200ms | なし(0ms) |
| シェーダー形式 | 独自形式(SkSL) | SPIR-V(汎用) |
| GPUバックエンド | OpenGL、Vulkan、Metal | Vulkan、Metal、Direct3D 12 |
| メモリ消費 | 高い(一時テクスチャ) | メモリプール、最大-40% |
| プラットフォーム | Android、iOS、Web、デスクトップ | Android、iOS、デスクトップ |
| ステータス | 安定版(メイン) | プレビュー(Skia置き換え) |
主な違いはシェーダーへのアプローチです。Skiaは使用時にシェーダーをコンパイルし、初めて未知のエフェクトをレンダリングする際にシェーダージャンクを発生させます。Impellerはオフラインコンパイルによってこれを排除します。また、SkiaはFlutterのウェブ版に必要なOpenGLをサポートしていますが、Impellerはより最新のAPIを優先してOpenGLを採用せず、モバイルデバイスでより優れたパフォーマンスを提供します。
Flutterアプリケーションでは、Impellerへの移行にコードの変更は必要ありません。ImpellerはSkiaと同じCanvas APIを実装しているため、すべてのウィジェット、アニメーション、カスタムペイントが同様に動作します。後方互換性はFlutter Engineレベルで保証されており、エンジンはアプリケーションの初期化時にレンダラー(SkiaまたはImpeller)を選択します。
ImpellerはSkiaと比較していくつかの測定可能な利点を提供し、ユーザーエクスペリエンスとFlutterアプリケーションのパフォーマンスに直接影響を与えます。
シェーダージャンクはImpellerが完全に解決するSkiaの主要な問題です。Flutterアプリケーションがグラデーション、マスク、または非標準のブレンドを含む新しい画面を表示するとき、Skiaはアニメーション中にシェーダーをコンパイルし、フレームドロップを引き起こします。Impellerはビルド時にすべてのシェーダーをコンパイルするため、最初のフレームは後続のフレームと同じ速さでレンダリングされます。GPUの遅いデバイス(MediaTek Helio、Qualcomm 400シリーズ)では、その違いは特に顕著で、Skiaでは新しいエフェクトタイプごとに最大200msの遅延が発生するのに対し、Impellerでは0msです。
ImpellerはGPUメモリ管理にリソースプールを使用します。Skiaでは、特に透明度でのレンダリングやsaveLayerの使用時に、各フレームが一時的なサーフェス用に新しいテクスチャを作成する可能性があります。Impellerはフレーム間でテクスチャを再利用し、Androidでのピークメモリ消費を30~40%、iOSで最大25%削減します。これは、長いリストやアニメーションを含むアプリケーションで特に重要であり、Skiaでは2GB RAMのデバイスでOOMエラーが発生する可能性がありました。
Skiaでは、フレームのレンダリング時間は、どのシェーダーがすでにコンパイルされているかによって異なります。新しいエフェクトを含む最初のフレームは50~200msかかる可能性がありますが、後続のフレームは3~5msです。この予測不可能性は、最適化とテストを困難にします。Impellerは、すべてのシェーダーがすでにコンパイルされ、メモリ割り当てが予測可能であるため、一貫したフレーム時間を保証します。Impellerを搭載したFlutter Engineは、各フレームの時間予算をより正確に計算できます。
ImpellerはOpenGLレイヤーなしで、Vulkan(Android)、Metal(iOS)、Direct3D 12(Windows)と直接動作します。これにより、ドライバーのレイテンシ低減(OpenGL経由より最大50%低減)、GPUメモリの直接制御、最新機能(タイリングGPUアーキテクチャ、GPU駆動レンダリング)へのアクセスなど、いくつかの利点があります。OpenGLはもはや進化しておらず、モバイルデバイス上のそのドライバーはしばしばパフォーマンスのボトルネックになります。
Impellerは活発に開発されており、Flutter MasterおよびBetaチャンネルで利用可能です。Flutter 3.16以降、ImpellerはiOSではデフォルトで有効になり、Androidでは設定フラグを通じてオプションで有効になります。SkiaからImpellerへの完全な置き換えは、2026年のFlutterの安定版リリースのいずれかで期待されています。
iOSでは、ImpellerはMetalを介して動作し、Flutter 3.16からデフォルトで有効になっています。Flutterチームは、Impellerでアプリケーションをテストし、問題を報告することを推奨しています。Skiaに戻すには、Info.plistファイルでImpellerフラグを使用します:FlutterEnableImpeller = NO。Flutter Teamによると、92%のiOSアプリケーションが視覚的な後退なしでImpeller上で動作し、アニメーションパフォーマンスが25~40%向上します。
Androidでは、ImpellerはVulkanを介して動作します。有効にするには、AndroidManifest.xmlにメタタグio.flutter.embedded_views_previewを追加します。Flutterチームは、さまざまなGPUアーキテクチャ(Adreno、Mali、PowerVR)向けにImpellerの最適化を続けています。Androidでの主な課題は、Vulkanをサポートしていないデバイス(Android < 7.0または古いGPU)のサポートです。そのようなデバイスには、Skiaによるフォールバックバックエンドまたはソフトウェアラスタライゼーションを備えたImpellerが使用されます。
Windowsでは、ImpellerはDirect3D 12(Flutter Masterで有効)を介して動作します。macOSとLinuxでは、それぞれMetalとVulkanを介して動作します。ImpellerはWeb向けには計画されていません。Flutterのウェブ版はCanvasKit(WebAssembly経由のSkia)を使用しており、ブラウザでのシェーダーコンパイルメカニズムが異なるため、シェーダージャンクは重要な問題ではないためです。ウェブ版は引き続きSkiaを使用します。
GoogleはImpellerのロードマップを公開しています:2024年 — iOSでデフォルトのImpeller;2025年 — AndroidとWindowsでデフォルトのImpeller;2026年 — Flutter EngineからSkiaを完全に削除。その後、FlutterはImpellerを唯一のレンダリングエンジンとして使用し、メンテナンスを簡素化し、エンジンサイズを削減し、すべてのプラットフォームでパフォーマンスを向上させます。
よくある質問
iOSでは、ImpellerはFlutter 3.16からデフォルトで有効です。Androidでは、AndroidManifest.xmlにメタタグio.flutter.embedded_views_previewをtrueの値で追加します。Windowsでは、起動時に--enable-impellerフラグを使用します。すべての場合において、DartコードでFlutterEngineを介して強制的に有効にすることができます。
Skiaは動作しますが、根本的な問題があります:シェーダージャンク(シェーダーコンパイルに50~200msの遅延)、高いメモリ消費、OpenGLアーキテクチャの制限です。ImpellerはFlutter専用に設計されており、オフラインのシェーダーコンパイルとメモリプールによってこれらの問題を解決します。
はい、ImpellerはSkiaと同じCanvas APIを実装しています。テキスト、画像、アニメーション、カスタムペイントなど、すべての標準Flutterウィジェットは変更なしでImpeller上で動作します。後方互換性はFlutter Engineレベルで保証されており、移行は開発者にとって透過的です。
いいえ、アプリケーションは一度に1つのレンダリングエンジンを使用します。選択はフラグを介してFlutter Engineを初期化するときに行われます。実行中にSkiaとImpellerを切り替えることはできません。レンダラーは最初のFlutterEngineインスタンスが作成されるまで固定されます。
SkiaはChrome、Android、その他のプロジェクト向けの独立したGoogleライブラリとして存続します。Flutterでは、SkiaはImpellerに主要なレンダラーとして置き換えられます。SkiaはFlutterのウェブ版(CanvasKit経由)およびVulkan/Metalをサポートしないデバイス向けのフォールバックオプションとして残ります。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。