[Flutter]Flutter描画エンジン(Skia)をネイティブフレームワークと比較
はじめに
昨今のアプリ開発において、モダンなプロジェクトのほとんどが宣言的UIによるコーディングにリファクタ、リプレイスされてきているように思われる。
IosにおけるNavigationLink,AndroidにおけるNavigationComposeの普及で、さらにSwiftUI、JetPackComposeともにコンポーネント単位、コンポーネントツリーを活用した実装がモダンとなってきていると個人的には感じている。
コンポーネントでの実装を念頭おくのであれば、当然視野に入ってくるのが、クロスプラットフォーム(Flutter)での開発である。
今回は、ユーザーインタラクション~アプリケーションシステムにスコープしてどのような違いがあるのかを見ていきたいと思う。
3つのプラットフォームフレームワーク
Flutterとネイティブ(Ios/Android)の違いを説明するにあたって、下記添付の3つのプラットフォームフレームワークに分類することができると思う。
Flutterにおいてネイティブのプラットフォームフレームワークをバイパスするのは、ビューシステムのみで、独自の描画エンジン(Skia)を利用して直接UIをレンダリングしているようだ。
独自レンダリングを行うことにより、ウィジェットベースのアプローチを実現し、共通のUI作成を可能としており、また、Flutter特有のリッチなUI作成につながっているとも言えそうである。
システムサービス/マネージャーフレームワークのライフサイクルやWindow管理は、Flutter自体がを直接管理するわけではなく、フレームワークが背後で処理しているそうです。
また、ハードウェアインターフェースと呼ばれる、ハードウェアへのアクセスはチャンネルを通じて行われており、こちらはネイティブのライブラリを使って実装し、それをFlutter側から呼びだすのが、今のところベストプラクティスだと言えそうだ。
※さらに詳しく解説されている
ユーザーインタラクションから見てみよう
ネイティブはそれぞれのプラットフォームフレームワークにアクセスするのに比べ
独自フレームワークにアクセスし、ユーザーインタラクションを独自フレームワークで処理するという形になっている。
まとめ
エンジニアとして、どちらの方がパフォーマンスが良いか、メモリ測定やレンダリングスピードの測定をして判断しなければいけないとは思うが、個人的にStorybord✖️SwiftUI,Fragment✖️JetpackComposeよりはパフォーマンスが良いのではと感じている。
宣言的UIでの知見はそのままアセットとして継続して使えること、またFlutter特有のもっさりとした印象も最近は無くなってきており、ネイティブ特有の機能以外では、FlutterでのコーディングでリッチなUIを実現した方が、メンテナンス性向上、そして何よりユーザーにとって良い体験を提供できるのではないか感じている。
Discussion