📝

Flutterはなぜ他のクロスプラットフォームよりも性能がいいのか

2023/11/26に公開

はじめに

Flutterの描画の仕組みを調べて学んだことを自分なりの解釈を加えてまとめてみました。

内容としては、タイトル通り「Flutterはなぜ他のクロスプラットフォームよりも性能がいいのか」です。
※指標を測定したわけではなく、あくまでFlutterの開発チームがそう言っている、というだけなのでご注意ください。

UI描画のプロセス

はじめにUIが画面に描画されるまでに行われるプロセスを整理しておきます。

  1. コーディング
  2. 配置決定:コードを解析し、画面全体のレイアウトを決定
  3. ラスタライズ:2で決定した配置を基に、各ピクセルに出力される内容を決定
  4. 描画:ラスタライズの情報を基に実際に画面に描画

1は開発者が行い、2以降はシステム(OS)側で行われます。

一般的なクロスプラットフォームの描画の仕組み

クロスプラットフォームを実現する方法として一般的なのは、
 各UIパーツごとに、Androidならjavaコードに、iosならobjective-cのコードに変換する
というものです

Text(){
  if (Android){
    //javaでのText
    return TextJava
  }
  else if (ios){
    //objective-cでのText
    return TextObjective-c
  }

図で表すと以下のようになります。

※これもどのフレームワークがどんな方法をとっているのか調べたわけではありません。Flutter開発チームが・・・(以下略)です。

何が問題か

これのどこが問題なのでしょうか?
実際のアプリでは画面内に多数のUIが存在します。
上記の方式だと、各プラットフォームの言語に変換する処理がUIの数だけ起こり、このオーバヘッドが大きくなってしまいます。

Flutterの描画の仕組み

Flutterの場合は上記のように各プラットフォームの言語に変換するということはしていません。
Flutterが3.ラスタライズまで行います。
下記がFlutterの内部構造ですが、Engineがラスタライズまで行い、OSに依存する部分はEmbedderが担います。

図で描くと以下のようになります。

これにより上記のようなオーバヘッドをなくせますね。

まとめ

  • 一般的なクロスプラットフォームでは、コードを各プラットフォームのものに置き換える
  • この場合、UIの数だけ変換が起こり非効率
  • Flutterの場合、ラスタライズまでFlutterが行うので、変換によるオーバヘッドは小さい

参考文献

https://docs.flutter.dev/resources/architectural-overview#architectural-layers

Discussion