Cover Image for 読書メモ:Game Development with Rust and WebAssembly (Chapter 1,2)

読書メモ:Game Development with Rust and WebAssembly (Chapter 1,2)

概要

↑を読んだメモ

サンプルコードを書いて遊んでたリポジトリは以下

メモ

1章 Hello WebAssembly

1.2 WebAssembly とは何か?

正直に言えば性能のために Rust と Wasm を使うわけで はない。いずれにしろ性能は保証されるわけではない。Rust と Wasm を使うのは、Rust が好きだからだ。 それでいいのだ!

初っ端から最高だった

1.3 Rust と WebAssembly プロジェクトのスケルトン作成

node18で動かしたからかサンプルが動かなかった。

  opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
  library: 'digital envelope routines',
  reason: 'unsupported',
  code: 'ERR_OSSL_EVP_UNSUPPORTED'
}

以下を参考に NODE_OPTIONS=--openssl-legacy-provider をつけてとりあえず回避した

1.4 HTML Canvas を用いたスクリーンへの描画

サンプルが動かないのでweb-sysのfeaturesにWindowなどを追加する必要がある

[dependencies.web-sys]  
version = "0.3.64"  
version = "0.3.64"  
features = ["console", "Window", "Document", "HtmlCanvasElement",  "CanvasRenderingContext2d", "Element"]

と思って色々調べたのに、サンプルコードの後に書いてあった。

この時点ではunwrap地獄なので若干見づらい。 JS <-> Rust の境界で曖昧さが Option/Result などに吸収された結果だと思われる。

2章 スプライトの描画

2.3 Canvas へのスプライトの描画

2.3.4 JavaScript のコールバック

JavaScript と Rust は、いろいろなものを抽象化して隠しているが、それがあちこちから漏れ出してしま う場合がある。Rust のクロージャから JavaScript のクロージャに変換する場合はその 1 つだ。

危惧していた通り思想の違いが言語の境界で問題になりそう。 どう解決策が提示されるのか気になる

2.3.5 非同期 Rust

spawn_local と async/await 使ってブラウザ側のイベントループ止まらないように注意しないといけないのは若干めんどい

Mutexの中身をOptionにするのはまだよくわからなかった

2.4 スプライトシートを用いた複数スプライトのロード

サンプル通りにやるとスプライトシートから描画したやつが、三角形の後ろの回ってしまう気がする???