Создание графических приложений с помощью Wasmer и WASI

MVP WebAssembly предоставил разработчикам множество действительно интересных функций и большой потенциал для будущих приложений! Однако, поскольку технология еще молода, есть еще много функций, которые еще не совсем готовы. Например, такие функции, как потоки, типы интерфейсов и т. Д., В настоящее время являются предложениями для спецификации, но многие приложения зависят от этих функций. 🤔

Сегодня в Wasmer мы рады представить предварительную версию экспериментальной функции, над которой мы работаем: Устройства ввода-вывода! Устройства ввода-вывода создают специальные файлы, которые модули WebAssembly могут читать и записывать, для рисования графики и обработки ввода.

Устройства ввода-вывода можно включить, передав флаг в интерфейс командной строки Wasmer, и они доступны в виде пакета для Wasmer-JS. 🔌

Давайте сделаем шаг назад и узнаем, как устройства ввода-вывода могут помочь сообществу сегодня.

Узнаем, какие функции может использовать сообщество уже сегодня

Мы провели небольшое исследование того, что люди в сообществе открытого исходного кода пытаются создать с помощью WebAssembly, и обнаружили, что это было много игр! Sandspeil, WasmBoy и Порт продолжения DOOM 3 - все это потрясающие игры, созданные с помощью WebAssembly. Игровые движки, такие как Unity, Gdevelop и Construct 3, поддерживают вывод игр для веб-браузеров, использующих WebAssembly. 🎮

Однако ни одна из этих игр или движков не поддерживает автономный запуск игры. Например, в настоящее время у вас не может быть единого двоичного файла Wasm для создания и взаимодействия с графикой и вводом, поскольку вам все равно потребуется дополнительный код для конкретной платформы (например, веб-браузера) на другом языке.
Ввод-вывод Wasmer devices позволяет разработчикам иметь один двоичный файл Wasm для открытия окна, записи в буфер кадра и чтения событий ввода от пользователя. 💪

Давайте посмотрим, как работают устройства ввода-вывода, и включим эту функцию.

Создание приложений WASI с помощью устройств ввода-вывода Wasmer

Устройства ввода-вывода работают, создавая файлы виртуальных устройств в файловой системе времени выполнения, аналогично файлу устройства в операционной системе UNIX. Если модуль Wasm использует привязки WASI для чтения / записи файлов, среда выполнения может реагировать на события и выполнять действия для модуля Wasm. 😎

Например, устройства ввода-вывода создают файл/_wasmer/dev/fb0/fb, содержащий байтовый массив RGBA буфера для рисования. Что похоже на запись напрямую в фреймбуфер Linux! 🖼️

Поскольку API по сути является абстракцией по сравнению с обычной файловой системой и текущей спецификацией WASI, устройства ввода-вывода Wasmer можно опробовать сегодня с любым языком / набором инструментов, поддерживающим WASI!

Фактически, у нас даже есть рабочая автономная версия WasmBoy, которую можно попробовать со средой выполнения Wasmer! Это работает с использованием пакета io-devices-lib-assemblyscript, который мы создали. Пакет, а также ящик Rust для взаимодействия с устройствами ввода-вывода можно найти в нашем репозитории io-devices-lib.

WasmBoy теперь доступен на WAPM, как WasmerBoy. Вы можете установить Wasmer и WAPM, следуя инструкциям здесь. Затем Wasmerboy можно установить автономно, запустив: wapm install -g torch2424/wasmerboy. Затем, запустив wasmerboy --dir=my-dir my-dir/my-rom-file.gb. Например, мы можем запустить Tobu Tobu Girl под лицензией MIT, используя WasmerBoy из WAPM:

Вы можете скачать ром Tobu Tobug Girl по этой ссылке.

WasmerBoy также работает с Wasmer-JS / WebAssembly.sh (в Desktop Chrome)! Вы можете перетащить файл ROM в WebAssembly.sh, который добавит его в файловую систему. Затем вы можете запустить ту же команду: wasmerboy /tmp/my-rom-file.gb. Откроется всплывающее окно, в котором работает WasmerBoy!

Спасибо!

Мы ТАК рады видеть интерес и проекты, которые могут возникнуть в результате этого. Мы действительно надеемся, что это поможет расширить сообщество WebAssembly и поможет авторам спецификаций как трамплин, когда это в конечном итоге будет предложено для спецификации WASI. 🙌

Опять же, мы хотели бы повторить итерацию, это экспериментальная функция, которая не стандартизирована. Устройства ввода-вывода предназначены для экспериментов со сборкой автономных модулей WebAssembly, чтобы заглянуть в будущее, когда в спецификации WASI может быть стандартизованная функция для этого типа функциональности. Поскольку эта идея является важной частью веб-платформы, как подчеркивается в лекции Пола Льюиса Custom Web Shadow Elements, or Anything… ».

Чтобы начать работу с устройствами ввода-вывода, в последней версии Wasmer появился новый флаг:
--enable-experimental-io-devices.

Устройства ввода-вывода имеют собственный пакет Wasmer-JS, @wasmer/io-devices. Пакет устройств ввода-вывода используется в пакете @wasmer/wasm-temrinal и WebAssembly.sh для поддержки устройств ввода-вывода по умолчанию.

Затем вы можете попробовать модуль Wasm, который использует устройства ввода-вывода, например WasmBoy на WAPM, или создать модуль Wasm на Rust или AssemblyScript, используя экспериментальную Библиотеку устройств ввода-вывода. 🦀🚀



Спасибо, что прочитали эту статью! Не стесняйтесь открывать вопросы, присылайте нам идеи или присылайте нам свои крутые проекты! Мы рады помочь сообществу, чем можем! Ваше здоровье! 🍻