Yet another нейрослоп
Увидел недавно пост про нейроигру и подумал, что автор слаб в нейрослопе - вручную копировать код, писать промпты для картинкогенераторов, туда-сюда перетаскивать файлы. Будущее нейроразработки это создание игр не выходя из Claude Code/Codex, поэтому я решил замутить свой прототипчик за неделю
Пара минут геймплея (видео может не загрузиться):
Архитектура
В качестве стресс теста для нейронок выбрал самый упоротый сетап - чистый THREE.js + TypeScript, при этом на тайпскипте в жизни не написал ни строчки. При этом в качестве бекенда выбрал исключительно webgpu, забив на поддержку старых бразуеров.
Что нам это даёт из доп. сложностей:
- Webgpu Three.js относительно новый и не очень хорошо документирован
- Минимум зависимостей значит то, что нам необходимо прописывать всю архитектуру, ECS, звук, внутриигровые скрипты и эффекты
- Производительность критична, браузер сам по себе берёт часть производительности + из three.js сложно выбрать даже долю того, что дают нативные платформы, по крайней мере для нейронок это оказалось сложным
- Желание вообще ничего не делать ни руками, ни сторонними программами и моделями - всё должно быть сгенерировано самим агентов, максимум через вызов кода на питоне
- Автоматический рендеринг webgpu через playwright достаточно геморный, когда сидишь на headless server, claude не справился, поэтому тестирование полувслепую - через скриншоты, которые я сам делал, либо через разные логи и метрики. Когда модель сама видит результат, то изменения немного быстрее идут, но расход токенов - моё почтение.
Сетап
Сначала я по привычке взял Claude Code, но без корпоративного плана на стандартном тарифе за 20$ токены улетают просто за один-два запроса, на большом репозитории только планирование изменений занимает под 30% пятичасового лимита. Помогло то, что посреди недели был релиз Opus 4.8 и они обновили недельный лимит. Выходом оказалась подписка на Codex - за те же деньги OpenAI даёт по ощущениям раза в 4 больше токенов + чаты в веб-версии не входят в лимит и там можно делать прототипы игровых систем, не тратя лимиты, а потом уже с первого-второго раза вливать их в основной проект.
Очевидный git - иногда нужно откатываться, плюс можно попросить чатгпт отревьювить незакоммиченный код сделаный клодом - через diff агент сразу видит изменения. Ревью и фиксы обязательны - ещё до того, как сам приступил к playtest. Хорошо работают перекрёстные тесты - открываешь две вкладки с разными агентами и по очереди просишь одного ревьювить результаты другого, плюс разные модели смотрят на код немного по разному
Ход разработки
В качестве референса взял minecraft dungeon - воксельный стиль позволяет использовать процедурные модельки, плюс простая генерация и редактирование мира. Но чисто процедурная генерация из случайного сида как в майнкрафте мне не подходит - нужен был способ сделать контролированную генерацию, если я хочу обрыв на севере карты - там должен быть сгенерирован обрыв и портал должен быть поставлен именно там где нужно по квесту.
Но сначала решил просто накидать фичи для боёвки, просто потому что это приятный процесс - накидывание фич нейронкой, считай как крутить рулеточку и начал генерировать механики для NPC по типу патруля, охоты, охраны мирных жителей и нападения бандитов, физика для падающих камней итд. По итогу это всё захламило проект кучей второстепенных фич и перегруженной логикой поведения NPC, которая начала отжирать FPS
На этом этапе я перезапустил разработку с нуля, портировав только рендеринг и механику передвижения и после этого сел накидывать базовые механики - освещение, полупрозрачные блоки, демо для позиционирование звука, процедурные объекты, редактор мира (как через код, так и визуальный), эффекты частиц и погоды плюс изменение времени суток. Потом перекинул часть механик NPC из предыдущего проекта.
Дальше была самая главная часть - автоматическая и управляемая генерация. Мир генерируется в несколько шагов:
- 1. Я пишу промпт с описанием локации, какой должен быть рельеф, квесты и персонажи - в идеале это тоже должно генерироваться нейронкой.
- 2. Дальше генерируется высокоуровневое описание: размеры мира, тип рельефа, где будут расположены структуры, погода на локации.
- 3. Потом алгоритм процедурно генерирует локацию, исходя из ограничений, заданных на предыдущем шаге, потом воксельная сетка чистится от лишних чанков и шума
- 4. Далее добавляются различные объекты, фиксированные структуры, на этом этапе нейронка оперирует координатами относительно маркеров, чтобы не галлюцинировать, оперируя X=1002, Z=511 и забывая какая Y-высота в этой области
- 5. Структуры делятся на процедурные и фиксированные - условно говоря модель может выбрать сгенерировать случайный одно-двухэтажный дом такого-то размера, либо добавить специально подготовленную структуру магазина или подъёмника
- 6. Потом пишутся скрипты: для NPC, синематики, интерактивные предметы на локации, чтобы было проще - подготовлены шаблоны для врагов, торговцев итп - нужно только внести изменения поверх шаблонов
- 7. В конце я тестировал и описывал в промпте что где поправить, редактор к локациям тоже навайбокожен, но из принципа ничего руками не менял - использовал только для просмотра и скрины сделать. Этот этап немножк сложнее автоматизировать, но по-хорошему тоже нужно
Зачем
Основная причина - построить пайплайн от промптов до титров, цель достигнута, это ни в коем случае не может тягаться с полноценными системами нейрослоповарения с интеграциями в юнити и анрил, и нет критического компонента - автотестирования с моделью и визуальной обратной связью. Заодно, совет - не стесняться придумывать свои DSL - LLM это в первую очередь языковая модель и ей неудобно работать с цифрами, сложными конструкциями, плюс огромным контекстом. Если превратить описание локации из массива вокселей в декларативное описание, которое комбинирует разные слои контента - то возможности модели и стабильность станут наголову выше, плюс добавляйте скиллы для новых API и пайплайнов, тогда скилл левел дизайнера это будет не просто промпт в стиле: "Теперь ты левел-дизайнер, делай хорошо, плохо не делай", а полноценный кусок документации с примерами, который уменьшит необходимость агента гулять по коду, чтобы понять как вызывать API.
Пару слов о моделях
- Opus 4.8 показался в целом немного умнее чем GPT5.5 в большинстве аспектов, особенно при планировании крупных миграций и переписывания уже разработанных модулей, чатгпт слишком придерживается уже написанного кода.
- Создание музыки и звуковых эффектов у Opus на голову выше, слушать то, что произвёл GPT вообще невозможно
- При этом Opus слаб в геометрии, поэтому процедурные модели, левел-дизайн и анимации делал через Codex, потому что Opus просто по кругу крутил одни и те же ошибки в позиционировании.
- В оптимизации обе модели не особо сильны, по мере наличия лимитов делал неоднократные попытки оптимизровать пайплайн рендеринга, но не особо успешно - при появлении нового эффекта статтер достигает пары секунд, а чуть более сложная геометрия убивает фпс с 60 до 30, сам же я не знаю как именно можно улучшить - и так есть инстансинг и buffered geometry
- Касательно webgpu three.js: поддержка и производительность в Firefox сильно хуже чем в браузерах на основе Chromium
- UI design у клода тоже сильно выше, они с их приложением для дизайна постарались вдолбить в сетку как центрировать div
ps.
Знатно я времени въебал на прокрутку миллионов токенов, энивей с работы уволили, к тому же было весело
Линк на игру: