voxelforge
Воксельный движок с играбельным демо в браузере. Рендерер нацелен на WebGL2/WASM, а ядро симуляции собирается нативно и покрыто тестами - десятки тысяч утверждений.
Воксельный движок с играбельным демо в браузере. Хитрость в том, что ядро симуляции ничего не знает об отрисовке - благодаря чему логику можно тестировать без GPU, десятками тысяч утверждений.
Обзор
voxelforge - это воксельный движок с играбельным демо, работающим в браузере. Рендерер нацелен на WebGL2 и WASM, но самое интересное решение касается не графики, а архитектуры: ядро симуляции полностью отрезано от отрисовки. Именно оно держит воксели, правила и соседства и ничего не знает о том, что что-либо появляется на экране.
Это одно решение изменило характер проекта. Вместо движка, который работает только тогда, когда вы запускаете его с видеокартой, возникла библиотека логики, которая работает везде и тестируется как обычный код. Остальная часть этого кейса - рассказ о том, почему это окупилось.
Воксельный движок должен делать две тяжёлые вещи одновременно: быстро рисовать мир и правильно его симулировать. Обе легко сломать так, что на первый взгляд выглядит хорошо, но всё равно неправильно - блок исчезает на один кадр позже, соседство считается на один воксель в сторону. Эти ошибки не кричат, а тихо портят мир.
Когда отрисовка и логика сплетены в одном коде, их нельзя разделить ни при тестировании, ни при отладке. Неизвестно, блок исчез неправильно потому, что симуляция посчитала его неверно, или потому, что рендерер его неверно нарисовал. Распутывание этих двух миров было самым важным во всём проекте.
Ядро, которое не знает о GPU
Решение было заодно и самым простым: ядро симуляции - это чистая логика, а рендерер берёт её состояние и превращает в треугольники. Ни одна часть ядра не касается canvas или GPU. Интерфейс между ними узкий и явный, поэтому рендерер может быть любым, а ядро об этом не знает.
Кто за что отвечает
| Слой | Роль | Зависимость от GPU |
|---|---|---|
| Ядро симуляции | воксели, правила, соседства | нет |
| Рендерер | превращение состояния в треугольники | WebGL2 / WASM |
Раз ядро не зависит от GPU, его собирают нативно и тестируют как обычную библиотеку. Рендерер нацелен на WebGL2 и WASM, но логика проходит тесты даже на CI-машине без видеокарты.
Тесты вместо надежды
Это разделение - не академическая роскошь. Именно благодаря ему у симуляции покрытие тестами, измеряемое десятками тысяч утверждений - а это единственный способ сказать о воксельном движке, что он правильный, а не только "хорошо выглядит". Ошибки на один воксель в сторону выходят в тесте, а не через час игры.
Эффект: демо, которое растёт без страха
На выходе - играбельное демо в браузере, которое можно развивать, не боясь, что попутно разъедется логика мира. Поскольку ядро протестировано отдельно, изменение в рендерере не может тихо сломать симуляцию, а изменение в симуляции сразу выходит в утверждениях. Движок не просто эффектный - он проверяемый.
Больше проектов
Другие работы из той же категории - посмотрите, как мы решаем похожие задачи.
Есть похожий проект?
Напишите нам - смета бесплатна и приходит в течение часа.



