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. 1. Я пишу промпт с описанием локации, какой должен быть рельеф, квесты и персонажи - в идеале это тоже должно генерироваться нейронкой.
  2. 2. Дальше генерируется высокоуровневое описание: размеры мира, тип рельефа, где будут расположены структуры, погода на локации.
  3. 3. Потом алгоритм процедурно генерирует локацию, исходя из ограничений, заданных на предыдущем шаге, потом воксельная сетка чистится от лишних чанков и шума
  4. 4. Далее добавляются различные объекты, фиксированные структуры, на этом этапе нейронка оперирует координатами относительно маркеров, чтобы не галлюцинировать, оперируя X=1002, Z=511 и забывая какая Y-высота в этой области
  5. 5. Структуры делятся на процедурные и фиксированные - условно говоря модель может выбрать сгенерировать случайный одно-двухэтажный дом такого-то размера, либо добавить специально подготовленную структуру магазина или подъёмника
  6. 6. Потом пишутся скрипты: для NPC, синематики, интерактивные предметы на локации, чтобы было проще - подготовлены шаблоны для врагов, торговцев итп - нужно только внести изменения поверх шаблонов
  7. 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.

Знатно я времени въебал на прокрутку миллионов токенов, энивей с работы уволили, к тому же было весело

Линк на игру:

4
1