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
30
WasmがFlutter on the Webに もたらす変化
Kosei Akaboshi (akaboshinit)
November 22, 2024
Tweet
Share
More Decks by Kosei Akaboshi (akaboshinit)
See All by Kosei Akaboshi (akaboshinit)
そのローカルDB、プロジェクトに合ってますか? 明日から変える最適なDB
akaboshinit
0
73
custom_lintで始めるチームルール管理
akaboshinit
0
350
Other Decks in Programming
See All in Programming
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
610
メルカリのリーダビリティチームが取り組む、AI時代のスケーラブルな品質文化
cloverrose
2
440
從冷知識到漏洞,你不懂的 Web,駭客懂 - Huli @ WebConf Taiwan 2025
aszx87410
2
3.3k
それ、本当に安全? ファイルアップロードで見落としがちなセキュリティリスクと対策
penpeen
4
960
大規模Cloud Native環境におけるFalcoの運用
owlinux1000
0
240
AIエージェントの設計で注意するべきポイント6選
har1101
6
2.9k
CSC307 Lecture 01
javiergs
PRO
0
650
AtCoder Conference 2025
shindannin
0
880
実は歴史的なアップデートだと思う AWS Interconnect - multicloud
maroon1st
0
300
HTTPプロトコル正しく理解していますか? 〜かわいい猫と共に学ぼう。ฅ^•ω•^ฅ ニャ〜
hekuchan
2
590
クラウドに依存しないS3を使った開発術
simesaba80
0
210
生成AI時代を勝ち抜くエンジニア組織マネジメント
coconala_engineer
0
37k
Featured
See All Featured
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
280
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
0
84
Highjacked: Video Game Concept Design
rkendrick25
PRO
0
260
Building Applications with DynamoDB
mza
96
6.9k
Designing for humans not robots
tammielis
254
26k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.1k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.5k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
140
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
54
48k
Site-Speed That Sticks
csswizardry
13
1k
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…