Делаю движок для 3D-игр на веб (ч.3)
Движок рассчитан на то, что игры в нём делает не человек, а ИИ-агенты. Вот, что добавилось в очередной итерации.
Иерархия объектов
Раньше каждая штука в сцене висела сама по себе – нельзя было сказать «эта телега, а это её колёса, двигай вместе». Теперь можно: ставишь объекту parent: car, и он становится «приклеенным» к родителю. Подвинул машину – колёса поехали с ней. Удалил машину – колёса исчезли сами. Камера, физика и сейвы это понимают.
Сейвы
Любая игра теперь сохраняется в браузер одной строчкой api save. F5 – состояние возвращается: монеты, прогресс, анимации, иерархия. Каждая игра пишется в свой ключ, не пересекаются.
Производительность
Движок упёрся в количество draw calls – Three.js на каждый объект делает отдельный вызов GPU. Большие сцены проседали: 300 кубов = 30 fps. Сделал три слоя оптимизации: одинаковые объекты теперь отрисовываются одним вызовом, для процедурных деревьев/заборов листья сливаются в одну геометрию с per-vertex цветом. Демо-сцена «деревня» (192 объекта) упала с 480 → 199 draw calls. На реальной видеокарте уверенные 60 fps.
Игра-инкрементал
Чтобы проверить всё это в одной игре, агент сделал «садовод». Сажаешь куст → растёт через tween-анимацию → собираешь → монеты → разблокируешь цветы и деревья → апгрейды (удобрение, лучший сорт, авто-сборщик). Полностью персистится – закрыл вкладку, вернулся, всё на месте. Под капотом одновременно работают: иерархия (растение – child грядки), сейвы, частицы (искры при сборе, капли воды при посадке), tween (рост), picking (клик в центре экрана через рейкаст).
Видео – агент сам играет, ходит, прыгает, переключает три вида растений и собирает урожай.
~6900 строк кода, 136 автотестов.
"~6900 строк кода" не в количестве строк счастье, а в качестве кода.