Процедурная генерация или ИИ-агент: что выбрать для уровня
Шум, грамматики и WFC против агента, управляющего редактором. Детерминизм, масштаб, рантайм и цена итерации — оси, по которым и стоит выбирать.
Решатель на 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, что скорее успокаивает, чем удивляет. Инструменты поменялись. Форма задачи — нет.