Rustからwasmを生成してみた話
by
rchaser53
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
Rust からwasm を作成してみた話 @rchaser53
Slide 2
Slide 2 text
CAUTION! 発表内容は発表者の独自調査によるものです 間違ってたらすみません
Slide 3
Slide 3 text
TL;DR; 現状Emscripten でwasm を作成したいのであれば LLVM やemcc の知識が大なり小なり必要
Slide 4
Slide 4 text
はじめに 勉強ついでに作ったRust のゲーム Emscripten でWeb Assembly(wasm) に変換してみました
Slide 5
Slide 5 text
出てくる単語の概要 SDL2 ゲームエンジンとして使用 Rust wasm の変換元のアプリを作るのに使用 Cargo Rust からwasm を作成するのに使用 Emscripten wasm に変換するのに使用 LLVM コンパイラ基盤。中間コード作成に使用
Slide 6
Slide 6 text
SDL2 Simple DirectMedia Layer 2 クロスプラットフォームの開発ライブラリ OpenGl や様々なハードウェアへアクセスに使用 例. オーディオ, キーボード, マウス etc...
Slide 7
Slide 7 text
Rust 今回重要なこと LLVM 上に構築されている言語 公式がwasm やasm.js にビルドする機能を提供
Slide 8
Slide 8 text
Cargo Rust のビルドシステム兼パッケージマネージャ 以下のような形でビルド対象を変更することができる (Rust 付属のrustc でもできる)
Slide 9
Slide 9 text
Rust 単体でwasm のビルドは不可 bit code からwasm に変換するEmscripten が必要
Slide 10
Slide 10 text
Emscripten bit code からasm.js やwasm に変換できるコンパイラー
Slide 11
Slide 11 text
Emscripten Compiler Frontend (emcc) 標準的なコンパイラーの代替を目指したもの C とかC++ からwasm を作る際にはこれ単体でOK
Slide 12
Slide 12 text
Emscripten Ports Emscripten 用の便利ライブラリ集 現在12 個しかない… 使用する際は以下のようにport を開ける
Slide 13
Slide 13 text
LLVM 様々な言語に対応可能なコンパイラ基盤 VM やClang など様々なサブプロジェクトが存在 今回はRust の中間コード(*.bc,*.o) への変換に使用
Slide 14
Slide 14 text
Rust 製 wasm
Slide 15
Slide 15 text
色々おかしい BGM 、効果音がない そもそも円じゃない
Slide 16
Slide 16 text
問題点 BGM 、効果音がない => emcc が正しく変換できていないっぽい そもそも円じゃない => 必要な依存ライブラリがEmscripten Ports にない
Slide 17
Slide 17 text
BGM 、効果音がない Emscripten が上手く動いていない File の読み込みまでは成功 rwops がnull になってしまっている模様
Slide 18
Slide 18 text
ちなみに… 作成したアプリはtxt ファイルからmap を作成している 任意にmap は変更できる => ファイルを読み込むこと自体はできている模様
Slide 19
Slide 19 text
FS Emscripten が提供する仮想FileSystem Linux/POSIX File System とほぼ同様のinterface C やC++ なら以下のような形でemcc が使える emcc 単体ではRust からwasm に変換できない… rustc やcargo などで中間コードを作成する必要がある
Slide 20
Slide 20 text
しかし… cargo から--preload-file のオプションをemcc に渡せない => js 上からファイルを読み込ませる var Module = { prerun: [function () { FS.createPreloadedFile( '/', 'text1.txt', '/text2.txt', true, false ) }] }
Slide 21
Slide 21 text
公式の見解は? Emscripten 用のビルドスクリプトは作ってくれている 新しいversion がrust-sdl2 に取り込まれれば動くだろう
Slide 22
Slide 22 text
そもそも円じゃない Emscripten Ports に 線や円などを描画するライブラリ「SDL2_gfx 」がない => SDL2_gfx を外してSDL2 が描画できる矩形で代用
Slide 23
Slide 23 text
自力でemscripten 用のビルドスクリプトを書くしかない cargo はrustc でを実行した後にemcc を呼び出している emcc が読めるインプット(*.bc, *.o など) にrustc で変換 emcc が読めるライブラリをビルドして読み込ませる
Slide 24
Slide 24 text
まとめというか感想 単純な変換なら特に問題なさそう ただし使えるライブラリがほぼない 自力でEmscripten 用ライブラリをビルドする必要あり LLVM とemcc の知識が必須
Slide 25
Slide 25 text
まとめというか感想 リベンジとして後日、別途公開します
Slide 26
Slide 26 text
ご静聴ありがとうございました!