I did pay attention to performance, even if it's overkill. Uses Zig compiled to WASM for the game state. Rendering is done in JS and WebGL reading from SharedArrayBuffer. I didn't think a single language was worth the boundary trampolining and extra tooling.
I tried to get muti-threading to work but that seems to require multiple web workers running instances of the WASM binary. It started to make other things more complicated (probably because I couldn't find the right level of abstraction) so I gave up. Running WASM in a single worker, off the main thread, is good enough for now.
Technical details:
I did pay attention to performance, even if it's overkill. Uses Zig compiled to WASM for the game state. Rendering is done in JS and WebGL reading from SharedArrayBuffer. I didn't think a single language was worth the boundary trampolining and extra tooling.
I tried to get muti-threading to work but that seems to require multiple web workers running instances of the WASM binary. It started to make other things more complicated (probably because I couldn't find the right level of abstraction) so I gave up. Running WASM in a single worker, off the main thread, is good enough for now.