(по крайней мере, пока)…

Недавно мы получили пинг в Твиттере по поводу вопроса о том, что WebAssembly (WASM) является будущим Babylon.js.

Вот наш ответ:

Кстати, наши друзья из Three.js ответили точно так же :)

Я хотел использовать этот блог, чтобы получить более подробную информацию о том, почему мы не думаем, что WASM - это будущее фреймворков JavaScript.

WASM - это цель, а не язык общения с пользователем

WASM предназначен для того, чтобы нативные разработчики (в основном на C / C ++) могли скомпилировать свой проект во что-то, что браузер может понять и выполнить.

Вы по-прежнему можете читать и, возможно, вручную писать код WASM, поскольку он основан на тексте (так же, как вы можете писать байтовый код вместо написания кода C # или Java). Использовать его таким образом просто ужасно неэффективно. Кроме того, чтобы уменьшить размер, большую часть времени модуль WASM хранится в двоичном формате.

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

Благодаря этому предполагается, что производительность WebAssembly выше, чем у эквивалента JavaScript.

Здесь вы найдете несколько примеров из реального мира, которые подробно описывают текущую ситуацию (предупреждение о спойлере: это не идеально, но приближается):

«WebAssembly работает быстро: реальный тест WebAssembly по сравнению с ES6 | Аарон Тернер | Середина"

Тест pspdfkit с использованием WASM дал мне 2928 баллов (чем ниже, тем лучше):

Версия JavaScript дает мне оценку 3701:

Такой прирост производительности больше всего привлекает веб-разработчиков. Но, к сожалению, это не то, на чем мы можем построить веб-фреймворк.

Основная причина в том, что писать WASM непросто (мягко говоря), поскольку на самом деле он не предназначен для написания людьми. Для компиляции в WASM вам потребуется движок, написанный на родном языке. Веб-фреймворк, созданный с помощью TypeScript, не является хорошим источником для компиляции в WASM (пока).

Мы долго обсуждали это в нашем репозитории, где мы оценивали возможность использования AssemblyScript (компилятор TypeScript в WASM): Переносить на asm.js / webassembly, стоит ли? · Проблема № 3248 · BabylonJS / Babylon.js (github.com) .

Вывод состоит в том, что на данный момент мы не видим веских причин для переноса всего движка на C ++ (огромный объем работы, уничтожение всех вкладов, которые мы могли бы получить от сообщества, сложность поддержки и т. Д.), Чтобы получить потенциальный прирост производительности WASM.

WASM не следует вызывать для небольшой части работы

Мы могли бы возразить, что некоторые части движка должны быть написаны с использованием WASM. Может быть, более ресурсоемкий (например, математическая библиотека).

Но есть одна загвоздка: коммуникация между средой JavaScript и средой WASM требует времени. Требуется небольшая сортировка, и такая сортировка стоит дорого.

Этот комментарий в нашем репо резюмирует его:

Https://github.com/BabylonJS/Babylon.js/issues/3248#issuecomment-430503359

Например, добавление 10000000:

WASM сложно отлаживать

Поскольку WASM нелегко читать, его нелегко отлаживать. Chrome недавно выпустил несколько инструментов в помощь: Отладка WebAssembly с помощью современных инструментов - разработчики Chrome

Но в двух словах вам нужно скомпилировать собственный код с символами отладки, чтобы получить некоторую поддержку отладки. Ясно, что это не то, чего мы ожидаем от веб-фреймворка, где отладка очень проста.

WASM мог быть толстым

Поскольку модули WASM должны обеспечивать все (от управления памятью до математической поддержки), они могут быстро стать большими активами, которые необходимо загружать каждый раз, когда вы запускаете свою страницу.

Например, в настоящее время мы работаем над поддержкой WebGPU. Для этого нам нужно скомпилировать наши шейдеры (написанные на GLSL) в WGSL, и для этого нам потребуется загрузить модуль WASM размером 3 МБ (просто помните, что вся библиотека babylonjs занимает 3 МБ).

Но мы все еще любим WASM

При этом мы не ненавидим WASM. Напротив, мы используем его в нескольких областях Babylon.js (в основном, когда мы хотим использовать существующий собственный код, который будет выполнять некоторые атомарные функции):

  • Декомпрессия Драко
  • KTX2 декодеры
  • Компиляция GLSL в WGSL
  • Физический движок боеприпасов
  • Navmesh и агенты толпы

Возможно, в будущем мы пересмотрим нашу позицию, если ситуация изменится, но мы всегда будем следить за тем, чтобы опыт для веб-разработчиков был на высшем уровне!

Дэвид ‘deltakosh’ Catuhe
https://twitter.com/deltakosh