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
26
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
330
Other Decks in Programming
See All in Programming
為你自己學 Python - 冷知識篇
eddie
1
350
testingを眺める
matumoto
1
140
プロポーザル駆動学習 / Proposal-Driven Learning
mackey0225
2
1.3k
はじめてのMaterial3 Expressive
ym223
2
310
OSS開発者という働き方
andpad
5
1.7k
GitHubとGitLabとAWS CodePipelineでCI/CDを組み比べてみた
satoshi256kbyte
4
230
MCPでVibe Working。そして、結局はContext Eng(略)/ Working with Vibe on MCP And Context Eng
rkaga
5
2.3k
Cache Me If You Can
ryunen344
2
700
今から始めるClaude Code入門〜AIコーディングエージェントの歴史と導入〜
nokomoro3
0
140
Kiroで始めるAI-DLC
kaonash
2
580
複雑なドメインに挑む.pdf
yukisakai1225
5
1.1k
ソフトウェアテスト徹底指南書の紹介
goyoki
1
150
Featured
See All Featured
Testing 201, or: Great Expectations
jmmastey
45
7.7k
Why Our Code Smells
bkeepers
PRO
339
57k
Intergalactic Javascript Robots from Outer Space
tanoku
272
27k
The Straight Up "How To Draw Better" Workshop
denniskardys
236
140k
Java REST API Framework Comparison - PWX 2021
mraible
33
8.8k
Designing for Performance
lara
610
69k
Site-Speed That Sticks
csswizardry
10
810
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
139
34k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
How STYLIGHT went responsive
nonsquared
100
5.8k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.9k
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…