Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
WasmがFlutter on the Webに もたらす変化
Search
Kosei Akaboshi (akaboshinit)
November 22, 2024
Programming
0
22
WasmがFlutter on the Webに もたらす変化
Kosei Akaboshi (akaboshinit)
November 22, 2024
Tweet
Share
Other Decks in Programming
See All in Programming
定理証明プラットフォーム lapisla.net
abap34
1
1.8k
Amazon S3 TablesとAmazon S3 Metadataを触ってみた / 20250201-jawsug-tochigi-s3tables-s3metadata
kasacchiful
0
120
Kubernetes History Inspector(KHI)を触ってみた
bells17
0
220
さいきょうのレイヤードアーキテクチャについて考えてみた
yahiru
3
740
動作確認やテストで漏れがちな観点3選
starfish719
6
1k
ファインディの テックブログ爆誕までの軌跡
starfish719
2
1.1k
Lottieアニメーションをカスタマイズしてみた
tahia910
0
120
Formの複雑さに立ち向かう
bmthd
1
810
Amazon Q Developer Proで効率化するAPI開発入門
seike460
PRO
0
110
SwiftUI Viewの責務分離
elmetal
PRO
1
220
CI改善もDatadogとともに
taumu
0
110
負債になりにくいCSSをデザイナとつくるには?
fsubal
9
2.4k
Featured
See All Featured
Unsuck your backbone
ammeep
669
57k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Building Your Own Lightsaber
phodgson
104
6.2k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
33
2.8k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.6k
The World Runs on Bad Software
bkeepers
PRO
67
11k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
114
50k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Gamification - CAS2011
davidbonilla
80
5.1k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
Building a Scalable Design System with Sketch
lauravandoore
460
33k
A Philosophy of Restraint
colly
203
16k
Transcript
WASMが Flutter on the Webに もたらす変化 © 2024 WinTicket Inc.
株式会社 サイバーエージェント 24年新卒 株式会社 WinTicket Flutter⽣まれ Flutter育ち Flutterやってるやつは⼤体友達 ⾃⼰紹介 Kosei
Akaboshi @akaboshinit
Wasmについて
Wasm(わずむ)? ヨクワカラナイ Wasm?
Web? Assembly? Wasm?
Webのみの技術では無い 厳密にはAssemblyでも無い ⾔語とかでも無い Wasm?
じゃあ何なんだ? Wasm?
Wasmホームページを参照 https://webassembly.org/ Wasm?
WebAssembly(略称:Wasm)は、 スタックベースの仮想マシン⽤のバイナリ命令フォーマットで ある。 Wasmはプログラミング⾔語の 移植可能なコンパイル‧ターゲットとして設計している(略) Wasm?
WebAssembly(略称:Wasm)は、 スタックベースの仮想マシン⽤のバイナリ命令フォーマットで ある。 Wasmはプログラミング⾔語の 移植可能なコンパイル‧ターゲットとして設計している(略) Wasm?
バイナリ命令フォーマット??? Wasm?
バイナリ命令フォーマット Wasm?
バイナリ命令フォーマット | テキストフォーマット ⼈は読めない書けない ⼈が読む書く 機械に優しい ⼈間に厳しい Wasm?
噛み砕くと Wasm?
Wasmは バイナリ命令フォーマットで吐き出される プログラミング⾔語のコンパイルターゲット Wasm?
Wasmは バイナリ命令フォーマットで吐き出される プログラミング⾔語のコンパイルターゲット Wasm? 🙆プログラミング⾔語のコンパイル(変換)先 🙆バイナリ形式のコードで扱う
さらに噛み砕くと Wasm?
プログラミング⾔語(ex.Dart)で作られた物を ある仕様を元に変換(コンパイル)して 作られるバイナリ形式(.wasm)のコード Wasm?
そのバイナリ形式(.wasm)の コードを何に使える? Wasm?
Webブラウザで実⾏できる Wasm?
Dartで作った関数をWasmに変換して ブラウザでWasmを実⾏すると Dartで書いたロジックを実⾏できる バイナリ形式なので、早くて軽くて⾊々嬉しい Wasm? 🙆プログラミング⾔語のコンパイル(変換)先 🙆バイナリ形式のコードで扱う
Wasm? Dartで作った関数をWasmに変換して ブラウザでWasmを実⾏すると Dartで書いたロジックを実⾏できる バイナリ形式なので、早くて軽くて⾊々嬉しい
Wasm? 早い、軽い、以外に何が嬉しいのか?
Wasm? Wasmを使うのも簡単 実際のWebでの使い⽅
Wasm? Wasmをビルドすると • *.wasm • *.js ⼆つのファイルが作られる
Wasm? Wasmは、ブラウザと直接通信できない JSのファイルを通して Wasmとネイティブ(ブラウザ)で 引数と返り値を双⽅向にやりとりする (webでダイアログを開いたり,Wasmで計算をさせたり)
Wasm? Wasmは、ブラウザと直接通信できない JSのファイルを通して Wasmとネイティブ(ブラウザ)で 引数と返り値を双⽅向にやりとりする (webでダイアログを開いたり,Wasmで計算をさせたり) FlutterでいうMethodChannelのように
Wasm? 早い、軽い、簡単、以外に何が嬉しいのか?
Wasmの思想から⾒ていきましょう Wasm?
Wasm Design Goal (13個のWasm設計の⽬標) Wasm?
4個を抜粋 Wasm?
Wasm?DesignGoal 🐥Compact 🔐Safe Platform-independent 👐Open
Wasm?DesignGoal 🐥Compact 🔐Safe Platform-independent 👐Open
Wasm?DesignGoal 🐥Compact - ⼩さい成果物になる事 前述のバイナリ命令フォーマットに変換を⾏い ビルド成果物が⼩さいファイルサイズになる 実⾏ファイルのダウンロード速度が速く、実⾏速度が早い ↑軽くて早くて嬉しい
Wasm?DesignGoal 🔐Safe - 安全に実⾏できる事 Wasm実⾏環境はサンドボックスで実⾏され、Wasm実⾏の メモリは別処理とは独⽴しています Wasmに⼊⼒されたデータ以外にはアクセスできなく安全 併せて、許可されていない外部の機能は実⾏できない ↑バイナリ命令フォーマットで、なんか簡単にシステム壊せ ちゃいそうだけど安全が担保される仕組みがあって嬉しい
Wasm?DesignGoal Platform-independent - どのような環境でも実⾏できる事 Wasmは仕様から環境(個々のブラウザ)への依存が無いよう 意識されています 環境依存は別の仕組みで抽象化していて、Wasmは依存のた めだけに⾯倒なことを頑張らなくて良いようにできています ↑ブラウザなどの環境は無数にあり、個々に仕様差がある けど、その差分を気にせず集中できるのが嬉しい
Wasm?DesignGoal 👐Open - シンプルに外部の環境と相互通信ができる事 Platform-independentであったように依存が無いように なっているが、OSやブラウザなどの環境が持つネイティブ 機能を呼び出すための安全な呼び出しや相互通信の⽅法をつ くりたい ↑どうしても環境に依存する時は必ずある、その時は抽象化 された⽅法で複雑性を増やさず、依存を呼び出せて嬉しい
Wasm?DesignGoal 👐Open - シンプルに外部の環境と相互通信ができる事 OSやブラウザなどの環境が持つネイティブ機能を呼び出す ための、安全な呼び出しや相互通信の⽅法を確⽴する ↑どうしても環境に依存する時は必ずある、その時は抽象化 された⽅法で複雑性を増やさず、依存を呼び出せて嬉しい 似ているイメージはFlutterのMethodChannel
👐Open - シンプルに外部の環境と相互通信ができる事 OSやブラウザなどの環境が持つネイティブ機能を呼び出す ための、安全な呼び出しや相互通信の⽅法を確⽴する 似ているイメージはFlutterのMethodChannel MethodChannelのように 依存が注⼊可能でロジックが綺麗になって嬉しい Wasm?DesignGoal
👐Open - シンプルに外部の環境と相互通信ができる事 OSやブラウザなどの環境が持つネイティブ機能を呼び出す ための、安全な呼び出しや相互通信の⽅法を確⽴する MethodChannelのように 依存が注⼊可能でロジックが綺麗になって嬉しい ↑ちなみに呼び出しや通信などはFlutter内部に組み込まれていて、 MethodChannelのように開発者がネイティブを書く必要は無い Wasm?DesignGoal
Wasm? (再掲)Wasmは早い、軽い、以外に 何が嬉しいのか?
Wasm? 🐥Compact(⼩さい) 🔐Safe(安全) Platform-independent(環境適応簡単) 👐Open(ネイティブ機能の呼び出しできる) ↑嬉しいことずくめ
Wasmビルドを使うことで なぜFlutter on the Webが早くなるのか
レンダラーの違い Flutter Renderer
レンダラーについておさらい Flutter Renderer
Flutter Renderer レンダラーとは FlutterのWidget等のUI要素を 元にUI表⽰(描画)を担うシステムのこと
Flutter on the Webには 現在3種類のレンダラーがあります Flutter Renderer
🕸HTMLレンダラー 📋CanvasKitレンダラー 🫦skwasmレンダラー Flutter Renderer
👴HTMLレンダラー(初期から有) 👴CanvasKitレンダラー(初期から有) 🎉skwasmレンダラー ↑Wasmを使っている場合(skwasmしか使えない) Flutter Renderer
⼀つずつ公式ドキュメントを 混ぜながら紹介 Flutter Renderer
📋CanvasKitレンダラー 最新のすべてのブラウザーと互換性があり、デフォルトのビルド モードで使⽤さ れるレンダラー WebAssembly にコンパイルされた Skia のコピーが含まれていて、ダウンロー ドサイズが約 1.5
MB 増加する => Flutterチームが⼤事に育ててきたレンダラー、かなり最適化されている => レンダリング⽅法としてHTMLのcanvas要素にUIを描画する Flutter Renderer
📋CanvasKitレンダラー 最新のすべてのブラウザーと互換性があり、デフォルトのビルド モードで使⽤さ れるレンダラー WebAssembly にコンパイルされた Skia のコピーが含まれていて、ダウンロー ドサイズが約 1.5
MB 増加する => Flutterチームが⼤事に育ててきたレンダラー、かなり最適化されている => レンダリング⽅法としてHTMLのcanvas要素にUIを描画する Flutter Renderer
📋CanvasKitレンダラー 最新のすべてのブラウザーと互換性があり、デフォルトのビルド モードで使⽤さ れるレンダラー WebAssembly にコンパイルされた Skia のコピーが含まれていて、ダウンロー ドサイズが約 1.5
MB 増加する => Flutterチームが⼤事に育ててきたレンダラー、かなり最適化されている => レンダリング⽅法としてHTMLのcanvas要素にUIを描画する Flutter Renderer
Flutter Renderer WebAssembly にコンパイルされた Skia のコピーが含まれていて Skiaとは、Flutterのアプリ(iOS,Android)でも使われている C++製のGoogleのレンダリングライブラリ 汎⽤的なレンダリングライブラリなため、Flutterに限らず他のフレーム ワーク等でも使われている(KMM)
Flutter Renderer WebAssembly にコンパイルされた Skia のコピーが含まれていて Skiaとは、Flutterのアプリ(iOS,Android)でも使われている C++製のGoogleのレンダリングライブラリ Flutter on
the WebではSkiaをWasmでビルドしたもの(CanvasKit)を 使って描画の処理を⾏っている
Flutter Renderer WebAssembly にコンパイルされた Skia のコピーが含まれていて Skiaとは、Flutterのアプリ(iOS,Android)でも使われている C++製のGoogleのレンダリングライブラリ Flutterに突然Wasmが来たと感じがちだが、今までデフォルトで使われてた CanvasKitもWasmだったので、Wasmに何だか親近感を持てるはずです
📋CanvasKitレンダラー 最新のすべてのブラウザーと互換性があり、デフォルトのビルド モードで使⽤さ れるレンダラー WebAssembly にコンパイルされた Skia のコピーが含まれていて、ダウンロー ドサイズが約 1.5
MB 増加する => Flutterチームが⼤事に育ててきたレンダラー、かなり最適化されている(3年) => レンダリング⽅法としてHTMLのcanvas要素にUIを描画する Flutter Renderer
📋CanvasKitレンダラー 最新のすべてのブラウザーと互換性があり、デフォルトのビルド モードで使⽤さ れるレンダラー WebAssembly にコンパイルされた Skia のコピーが含まれていて、ダウンロー ドサイズが約 1.5
MB 増加する => Flutterチームが⼤事に育ててきたレンダラー、かなり最適化されている => レンダリング⽅法としてHTMLのcanvas要素にUIを描画する Flutter Renderer
HTMLのcanvas要素は こんな感じのもの JSで指⽰を出してUIを作る ↑Flutterで似ているものとしては CustomPainter Flutter Renderer
🕸HTMLレンダラー HTMLレンダラーは、HTML 要素、CSS、canvas 要素、SVG 要素の組み合わせ てレンダリング => CanvasKitがcanvas要素にだけ書き込みするのに対して、様々な要素で構成 するため、内部実装の複雑性が⾼い Flutter
Renderer
🕸HTMLレンダラー 廃⽌の⽅針 Flutter Renderer
☂ Flutter Web の HTML レンダラーを廃⽌および削除する予定 ‧HTML レンダラーは、 他レンダラーと⽐較すると複雑で パフォーマンスが低くグラフィック表現⼒に限界があります。
‧他レンダラーがHTML レンダラーの複雑さ、メンテナンスコ ストを上回る段階まで成熟しました。 =>まだ完全に無くなっていないが、使えなくなる Flutter Renderer
🫦skwasmレンダラー WebAssembly にコンパイルされ、別のスレッドでのレンダリングをサポートす る Skia のよりコンパクトなバージョン Flutter Renderer
🫦skwasmレンダラー WebAssembly にコンパイルされ、別のスレッドでのレンダリングをサポートす る Skia のよりコンパクトなバージョン Flutter Renderer
🫦skwasmレンダラー WebAssembly にコンパイルされ、別のスレッドでのレンダリングをサポートす る Skia のよりコンパクトなバージョン ↑Flutter on the Web
with Wasmが早くなる理由の⼀つ Flutter Renderer
Skia のよりコンパクトなバージョン CanvasKit > Flutter on the WebではSkiaをWasmでビルドしたもの(CanvasKit)を 使って描画の処理を⾏っている どこがコンパクトなのか?
Flutter Renderer
Skia のよりコンパクトなバージョン CanvasKit > Flutter on the WebではSkiaをWasmでビルドしたもの(CanvasKit)を 使って描画の処理を⾏っている CanvasKitはWasmなので、冒頭に紹介したように
ブリッジ⽤JSと本体のWasmに分けられる Flutter Renderer
Skia のよりコンパクトなバージョン CanvasKit > Flutter on the WebではSkiaをWasmでビルドしたもの(CanvasKit)を 使って描画の処理を⾏っている CanvasKitはWasmなので、冒頭に紹介したように
ブリッジ⽤JSと本体のWasmに分けられる skwasmではCanvasKitのWasm本体にwasm-to-wasmバインディングで 直接接続する、だからコンパクト Flutter Renderer
Skia のよりコンパクトなバージョン CanvasKit > Flutter on the WebではSkiaをWasmでビルドしたもの(CanvasKit)を 使って描画の処理を⾏っている skwasmではCanvasKitのWasm本体にwasm-to-wasmバインディングで
直接接続する、だからコンパクト WasmとWasmが直接通信することで ブリッジJSを使うオーバーヘッドを減らすことができる Flutter Renderer
Skia のよりコンパクトなバージョン CanvasKit > Flutter on the WebではSkiaをWasmでビルドしたもの(CanvasKit)を 使って描画の処理を⾏っている skwasmではCanvasKitのWasm本体にwasm-to-wasmバインディングで
直接接続する、だからコンパクト WasmとWasmが直接通信することで ブリッジJSを使うオーバーヘッドを減らすことができる Flutter Renderer
🫦skwasmレンダラー skwasmではCanvasKitのWasm本体にwasm-to-wasmバインディングで直接 接続する、だからコンパクト WasmとWasmが直接通信することで ブリッジJSを使うオーバーヘッドを減らすことができる Flutter Renderer
Flutter on the WebがWasmによって受ける影響は⼤きく Flutter Renderer
Wasmビルドで良くなること
パフォーマンスの違い Wasmになって良くなること
同⼀のスクロール動作とページ遷移をした時の 動作完了時の1フレーム⽬の表⽰完了msを レンダラーごとに⽐較 Wasmになって良くなること
Wasmになって良くなること 同⼀のスクロール動作とページ遷移をした時の 動作完了時の1フレーム⽬の表⽰完了msを レンダラーごとに⽐較 ↑結果としてWasmの表⽰完了msが CanvasKit(JSビルド)より早ければ嬉しい
Wasmになって良くなること
Wasmになって良くなること 50%の確率で38%⾼速 90%の確率で52%⾼速 95%の確率で54%⾼速 CanvasKitに⽐べ Wasmの速度が⾼速
Wasmになって良くなること 50%の確率で38%⾼速 90%の確率で52%⾼速 95%の確率で54%⾼速 かなり効果的
実際のWasm対応と、よくある罠
Wasmファイル作成からWeb実⾏の流れ Flutter on the Web on Wasm?
Flutterプロジェクトの準備 Flutter on the Web on Wasm?
新規プロジェクトより既存プロジェクトを Wasm対応させる場合の⽅が難易度⾼いの で、そちらを解説 Flutter on the Web on Wasm?
⛔WasmのStableはFlutter 3.22なので それ以上のバージョンのFlutterにする Flutter on the Web on Wasm?
⛔JavaScript interoperabilityの対応 Flutter on the Web on Wasm?
⛔JavaScript interoperabilityの対応 ここは結構しんどいかもしれません Flutter on the Web on Wasm?
⼀瞬Wasmから離れて ⛔JavaScript interoperabilityの話 ⛔JavaScript interoperability
Flutter 3.22のタイミングで FlutterからのJSへのアクセス⽅法に⼤幅な 変更が⼊った ⛔JavaScript interoperability
Wasmを使うためには JavaScript interoperabilityの対応が必要 ⛔JavaScript interoperability
具体的な対応としては 右のパッケージを左に変更 ⛔JavaScript interoperability(余談)
具体的な対応としては 右のパッケージを左に変更 内部仕様結構変わっている ⛔JavaScript interoperability(余談)
⛔JavaScript interoperability対応は 依存パッケージなども含め 全てで⾏う必要がある ⛔JavaScript interoperability
⛔JavaScript interoperability 依存パッケージでは 基本は3.22リリース付近でJavaScript interoperability対応バージョンが出てるの でバージョン上げを⾏う ⛔JavaScript interoperability
⛔JavaScript interoperability 対応パッケージがリリースされてない場合 は、forkなどして⾃⼒で対応するしか無い ⛔JavaScript interoperability
ちなみにFlutter3.22だったとしてもWasm を使⽤しないのであれば、 JavaScript interoperability対応しなくて も問題なし ⛔JavaScript interoperability
Wasmに戻ります Flutter on the Web on Wasm?
⛔Flutter 3.22 <= ⛔JavaScript interoperability この対応でdebug起動の準備完了 Flutter on the Web
on Wasm?
“--wasm”を付けて”flutter run” Flutter on the Web on Wasm?
Wasmでdebug起動🎉 Flutter on the Web on Wasm?
To Be Continued…