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
More Decks by Kosei Akaboshi (akaboshinit)
See All by Kosei Akaboshi (akaboshinit)
custom_lintで始めるチームルール管理
akaboshinit
0
140
Other Decks in Programming
See All in Programming
体得しよう!RSA暗号の原理と解読
laysakura
3
540
PHPでお金を扱う時、終わりのない 謎の1円調査の旅にでなくて済む方法
nakka
3
1.4k
英語 × の私が、生成AIの力を借りて、OSSに初コントリビュートした話
personabb
0
120
PsySHから紐解くREPLの仕組み
muno92
PRO
1
530
アーキテクトと美学 / Architecture and Aesthetics
nrslib
12
3.1k
本当だってば!俺もTRICK 2022に入賞してたんだってば!
jinroq
0
260
보일러플레이트 코드가 진짜 나쁜 건가요?
gaeun5744
0
370
ベクトル検索システムの気持ち
monochromegane
30
9.2k
신입 안드로이드 개발자의 AI 스타트업 생존기 (+ Native C++ Code를 Android에서 사용해보기)
dygames
0
510
Windows版PHPのビルド手順とPHP 8.4における変更点
matsuo_atsushi
0
370
爆速スッキリ! Rspack 移行の成果と道のり - Muddy Web #11
dora1998
1
160
英語文法から学ぶ、クリーンな設計の秘訣
newnomad
1
270
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
29
2k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
4
500
Reflections from 52 weeks, 52 projects
jeffersonlam
349
20k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
45
9.5k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
4
480
Side Projects
sachag
452
42k
Rebuilding a faster, lazier Slack
samanthasiow
80
8.9k
Typedesign – Prime Four
hannesfritz
41
2.6k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
102
18k
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…