Bright Future – WebAssembly

[Translation may be some day]

Несколько лет назад я прочитал о начале проекта WebAssembly (wasm), идея разработчиков звучала примерно так – разработать байт-код для запуска приложений на разных платформах, архитектурах, акцент делается на запуске приложений в браузере.

Желание выкинуть медленный и непредсказуемый javascript, у меня созрело давно. Уже вчера я собрал и запустил свою тестовую игрушку на WebAssembly.

Здесь я опишу как мне это удалось.

Компиляция WebAssembly с помощью Emscripten

Установка Emscripten описана в прошлой заметке. Допустим у вас уже есть проект который корректно собирается из C++ в javascript, для сборки в wasm вам нужно добавить ключи:

-s WASM=1 -s ""BINARYEN_METHOD='native-wasm'""

Можете также попробовать другие ключи сборки описанные в официальной документации, я выбрал native-wasm как самый производительный вариант.

Включение WebAssembly

На данный момент идет процесс активной разработки, поэтому в стабильных версиях браузеров поддержки последней версии wasm нет. Для запуска wasm кода я использовал браузер Firefox Nightly для Ubuntu. Для включения wasm, нужно зайти в about:config и включить его:

Также заявлена поддержка в других браузерах (Chrome).

WebAssembly в действии

Проверить как работает WebAssembly вы можете открыв страницу игры Tanks движка Unity. Есть подозрение что там используется fallback на javascript, т.к. работает даже в обычном браузере.

Также можете попробовать запустить тестовую версию моей игры Bad Robots для wasm.

Если ваш браузер показывает черный экран и ошибку “Exception thrown, see JavaScript console” и в отладочной консоли текст “uncaught exception: no binaryen method succeeded. consider enabling more options, like interpreting, if you want that: https://github.com/kripken/emscripten/wiki/WebAssembly#binaryen-methods“, тогда устанавливайте лучший браузер Firefox Nightly и включайте WebAssembly по инструкции выше.

Всем удачной компиляции.

My Retro 16-bit Experience

Sorry for Runglish.
One day I got email, with something like this text:
“Hey! we are going to start retro game jam – bitbitjam3!!! You need to create game for some retro platform (8-16 bit)!!!”
Wow! It was my childhood dream – to create game for my favourite 16-bit console – Sega Genesis.
So I tried to create game for #bitbitjam3 game-jam, and I created something:
rqr
This thing called – “Red Queen Rampage”. Story of this game “Red Queen has been captured inside deadly maze, she is going to kill everything on her way to freedom.”
You can walk, you can attack green thing with red eyes, you can open treasure chest, and you can move from scene to scene.
This is actually hello-world level project in sega genesis world. I used SGDK toolset – GCC-based Motorola 68K compiler, and sega genesis specific hardware libraries.
Now I understood that it was really tough business to make games 20-30 years ago. For example – graphics (tiles) must be splitted into 8×8 pixels pieces, and then drawed together one-by-one. Every tiles must have its own pallete, only 16 color available! Damn its very easy to be gamedev at present time.
And like in nowadays – you need to create game engine, sound engine, graphics engine for game.
You can look at playable prototype of Red Queen Rampage by using Sega Genesis emulator with this ROM:
http://demensdeum.com/games/redQueenRampageSegaGenesis/RedQueenRampage.zip
If you interested in source code:
http://demensdeum.com/games/redQueenRampageSegaGenesis/RedQueenRampageSource.zip