Процедурная генерация или ИИ-агент: что выбрать для уровня

Шум, грамматики и WFC против агента, управляющего редактором. Детерминизм, масштаб, рантайм и цена итерации — оси, по которым и стоит выбирать.

Городок с улицами, переходами, кирпичными домами и коттеджами, построенный агентом в Cuberta

Решатель на wave function collapse выдаст десять тысяч корректных подземелий до обеда, и ни одно из них не запомнится. Агент, управляющий редактором, построит одну городскую площадь, где фонтан стоит там, где его поставил бы человек, — за четыре минуты и за деньги при каждом запуске. Это не две попытки сделать один и тот же продукт. Это разные машины, и единственный полезный вопрос — под какую из них сделана ваша задача.

Что такое классическая процедурная генерация

Процедурная генерация — не одна техника, и разговор чаще всего ломается ровно там, где её считают чем-то монолитным. Основную работу в вышедших играх делают четыре семейства.

Поля шума

Функция из координат в число — Perlin, simplex, ячейки Worley, — просуммированная по нескольким октавам, а затем пересчитанная в высоту, влажность, плотность руды, объём пещер. Достаточно дёшево, чтобы считать на вершину, бесконечно в любую сторону и детерминированно при фиксированном сиде. В Godot FastNoiseLite лежит прямо в движке, в остальных до того же одна небольшая функция. Шум даёт рельеф. Чего он не даёт — намерения: у шума нет мнения о том, где ставить деревню.

Грамматики и переписывание

L-системы пришли из биологии: Аристид Линденмайер, 1968 год, модель роста водорослей. Оказалось, что они прекрасно описывают ветвящиеся растения, — поэтому инструменты для растительности до сих пор на них и стоят. Грамматики форм делают то же самое для архитектуры: правила CGA в CityEngine режут объём на этажи, этажи на панели фасада, панели на окна. Переписывание графов работает уже не с геометрией, а с топологией уровня: правила «найти и заменить» на графе комнат и связей.

Канонический пример последнего — циклическая генерация подземелий в Unexplored, и её масштаб полезно знать. Два генератора, множество модулей и около пяти тысяч отдельных правил переписывания, написанных вручную в специально сделанном инструменте. Это честная цена грамматики — и одновременно её смысл: пять тысяч правил — это пять тысяч кусочков дизайнерского намерения, записанных один раз и работающих всегда.

Решатели ограничений

Wave function collapse — реализация Максима Гумина 2016 года того, что Пол Меррелл опубликовал в 2007-м под названием model synthesis, — рассматривает уровень как сетку клеток, в каждой из которых лежит набор ещё возможных тайлов. Схлопнуть клетку с наименьшей энтропией, распространить ограничения соседства, повторить. Вы даёте тайлы и правила, какие грани с какими могут стыковаться, — и решатель структурно не способен выдать недопустимый стык. Чего он не скажет, так это интересно ли по получившемуся ходить.

Системы внутри движков и DCC

В Unreal есть нодовый фреймворк PCG: пространственные данные приходят от компонента на уровне, превращаются в точки, проходят через граф фильтров и преобразований и порождают меши — вживую в редакторе или уже в рантайме. Houdini стоит на другом конце конвейера: цифровой ассет собирается один раз и подгружается в Unity или Unreal через Houdini Engine с вынесенными наружу параметрами. Вот здесь PCG перестаёт быть демо и становится производственной инфраструктурой: в Ghost Recon Wildlands так делали тысячи километров дорог по горному рельефу, а команда Far Cry 5 каждую ночь пересобирала весь игровой мир на билд-машинах.

На таких системах стоят целые открытые миры, и никуда они не денутся.

Что такое агент, управляющий редактором

Второй подход даёт языковой модели те же инструменты, которыми пользуется левел-дизайнер: проложить дорожную сеть, нарезать кварталы, поставить здание таких-то габаритов, рассыпать деревья внутри полигона, выставить угол солнца, — и позволяет работать шагами, считывая сцену между ними. Так устроена Cuberta: редактор отдаёт инструменты уровня локации по Model Context Protocol, вы подключаете к нему своего агента, и локация появляется объект за объектом, а выделить, подвинуть и отменить можно что угодно.

Структурная разница здесь не в «ИИ против алгоритма». Она в том, что результат процедурной системы — система, производящая контент, а результат агента — сам контент. Одно — завод. Другое — очень быстрый подрядчик.

Рантайм против времени разработки

Это различие закрывает большую часть споров ещё до интересного места — и его постоянно проскакивают.

Процедурная система компилируется в вашу игру. Сид, пара килобайт правил и функция шума превращаются в планету на машине игрока, сгенерированную за кадр до того, как он её увидит. Агент так не может. Ему нужны модель, сетевой запрос, десятки секунд или минуты и деньги за каждый вызов. Никто не поставит это в переход между этажами рогалика.

Если в требованиях есть слова «в рантайме» — бесконечный ландшафт, новое подземелье на каждый забег, мир, который слишком велик, чтобы везти его данными, — сравнение закончилось, не начавшись. Вам нужна процедурная генерация, и никакой агент этого не изменит. Агенты живут целиком на этапе разработки, по эту сторону сборки.

Детерминизм и сид, который можно поставлять

Один сид — один и тот же мир на любой машине и навсегда. Звучит как техническая сноска, а стоит очень дорого.

Elite уместила галактику звёздных систем в машину с килобайтами памяти, храня сид вместо систем. No Man's Sky выводит планеты, флору и цветовые палитры из 64-битного сида — отсюда и цифра в 18 с лишним квинтиллионов планет, и то, что два игрока, прилетевшие в одни координаты, находят одни и те же скалы. Игрок Minecraft может вставить сид в форумный пост, и у другого человека соберётся идентичный мир.

Повседневная выгода скромнее рекламной и куда полезнее. Баг-репорт с сидом воспроизводится. Дизайнер фиксирует сид обучающего острова и правит правила, не боясь, что остров уедет из-под ног.

Агент не даёт ничего из этого. Один и тот же промпт дважды — два разных города, оба правдоподобны, ни один не воспроизводим. Но стоит быть точным в том, что именно потеряно: недетерминирован процесс, а не результат. Как только агент собрал сцену и вы выгрузили GLB, этот файл зафиксирован ровно так же, как сделанный руками, и между сборками не поплывёт. Вы теряете воспроизводимую генерацию — она важна в рантайме и в QA. Стабильный ассет вы не теряете.

Остальные оси

Процедурная системаАгент в редакторе
Что вы пишетеправила, делающие контентсам контент
Первый результатдни — сначала строится системаминуты
Десятитысячный результатпрактически бесплатнов десять тысяч раз дороже первого
Один и тот же вход дваждыидентичный вывод по построениюдругой правдоподобный ответ
Где работаетв редакторе и внутри игрытолько на этапе разработки
ТЗ поменялось на полпутиправить правила и перегенерировать всёсказать новое и продолжить
Когда вышло кривочитать граф, бисекция по сидупосмотреть шаг и попросить переделать
Кто это пишеттот, кто свободен в графах или кодетот, кто умеет описать место
Сильная сторонамиллион приемлемых результатоводин по-настоящему хороший

Намерение: записано один раз или прочитано каждый раз

Грамматика — это скомпилированное намерение. «Магазины на углах, жильё в середине квартала, ничего выше трёх этажей в 40 м от площади»: один раз записали — и это держится на всех экземплярах, которые система когда-либо породит, годами, без вашего участия. Цена в том, что намерение нужно уметь сформулировать правилами. «Эта улица должна выглядеть так, будто её наспех отстроили после пожара» — не правило, во всяком случае не то, которое вы напишете за день.

Агент читает намерение заново на каждый запрос. Вы получаете улицу после пожара, не написав под неё ни одного правила, — и завтра из той же фразы получите другую. Интерпретация приносит гибкость и несогласованность одной посылкой, взять только первое нельзя.

Масштаб и точка пересечения

На миллионе экземпляров процедурная система выигрывает с отрывом, который ничем не закрыть: её предельная стоимость на экземпляр близка к нулю, у агента она не падает никогда. На одном экземпляре порядок обратный: система стоит дней до первого результата, у агента первый результат — минуты. Пересечение проходит не на миллионе. На практике оно где-то в первых десятках — примерно там, где вы замечаете, что пятый раз объясняете агенту одно и то же ограничение и всё это время вручную исполняли правило, которое можно было записать.

Где агенты действительно выигрывают

  • Единичные места, которые должны ощущаться сделанными руками. Хабовая деревня, арена босса, улица из трейлера. Никто не пишет генератор ради того, что нужно один раз, а обобщённо сгенерированная версия места, где игрок проведёт два часа, — ровно неправильная экономика.
  • ТЗ, которое меняется на полпути. «Пусть это будет рыбацкая деревня» — одна фраза для агента и переписывание для грамматики, потому что правила, породившие шахтёрский городок, кодируют уже неверные предпосылки.
  • Когда правила дороже результата. Три варианта скотного двора не оправдывают генератор скотных дворов. Десять тысяч — оправдывают. Большинство задач ближе к трём.
  • Команды без технического художника. Грамматике нужен человек, думающий графами или кодом. Агенту нужен человек, умеющий точно описать место, — этот навык у левел-дизайнеров встречается чаще.

В чём агенты плохи

Согласованность на множестве сцен

Попросите сорок домов — и агент сорок раз истолкует слово «дом». Поплывут высоты этажей, профили бордюров, расширится палитра материалов. Процедурная система на китах такой ошибки не сделает: у неё один кит и один набор ограничений. Согласованность — задача про ограничения, а агенты ограничения приближают, а не соблюдают. Это самый сильный довод за то, чтобы под агентом оставался процедурный слой.

Стоимость сцены

Каждая локация стоит времени модели и денег, и десятая стоит столько же, сколько первая. Затраты процедурной системы почти целиком вперёд — и это гораздо более удачная форма, как только нужен объём.

Их нельзя поставить в игру

Повторю, потому что это самое жёсткое ограничение в сравнении: агент — инструмент в конвейере, а не система в игре. Всё, что он строит, должно быть запечено в ассеты до того, как это увидит игрок.

Гибрид, к которому придёт большинство

Не компромисс, а разделение труда по тем же осям. Агент авторствует, процедурная система заполняет.

Конкретно: агент раскладывает дорожную сеть, структуру кварталов и те двадцать зданий, на которые игрок реально посмотрит, — потому что там нужны решения, а зданий всего двадцать. Локация уезжает из Cuberta в GLB или FBX с текстурами, а в движке эстафету принимает граф PCG: растительность по уклону и маске биома, уличная мебель вдоль сплайнов, дальний наполнитель по плотности — и всё это пересчитывается, как только сдвинулась планировка. Всё, что обязано существовать в рантайме, остаётся на процедурной стороне, потому что иначе нельзя. Большинство инструментов, которые продают как ИИ-генераторы городов, уже стоят на этом шве: модель выбирает планировку и стиль, а расставляют процедурные правила.

Признак того, что разделение проведено верно, — направление, в котором течёт работа: решения агенту, объём правилам, и ни одного не просят делать чужое дело. Примерно так же это разделение работало между ведущим дизайнером и художником на Houdini, что скорее успокаивает, чем удивляет. Инструменты поменялись. Форма задачи — нет.