Инди-разработчик Allie Bri поделилась прогрессом по интерактивной симуляции толпы в Unreal Engine 5: сцена с 10 000 врагов и более чем 12 000 снарядов в секунду при времени гейм-треда около 10 мс на 100 000 AI-агентов.
Ключевые технические решения
Текущая версия проекта — результат многолетних экспериментов и оптимизаций. Ранее попытки разработчика упирались примерно в 10 000 сущностей, после чего нагрузка на CPU становилась критичной. Теперь система стабильно обрабатывает порядок 100 000 AI благодаря ряду архитектурных решений.
Многопоточность и параллелизм
Логика проекта активно использует многопоточность и параллельные вычисления. Основной упор сделан на:
- минимизацию взаимозависимостей данных между потоками;
- корректное выравнивание данных под кэш (cache alignment);
- data-oriented design — хранение и обработку данных в формах, удобных для CPU и кэшей, а не для объектно-ориентированной структуры кода.
Дополнительно применяются продуманные стратегии разбиения данных (partitioning), что позволяет равномерно распределять нагрузку между потоками и уменьшать блокировки.
Потенциал дальнейшей оптимизации
Разработчик отмечает, что текущая версия ещё не предел. Возможные направления улучшений:
- использование более оптимизированных структур ускорения (acceleration structures) для пространственных запросов и поиска соседей;
- перенос части вычислений на GPU (GPU computing) для разгрузки CPU;
- дополнительные низкоуровневые оптимизации в рамках выбранного data-oriented подхода.
Оптимизация визуала: health bars
Отдельно выделена реализация индикаторов здоровья. Вместо стандартных UI-виджетов используются:
- импортированный quad-полигон как Instanced Static Mesh;
- простой материал с использованием World Position Offset (WPO), чтобы планка разворачивалась к камере как billboard.
Такой подход позволяет выводить большое количество индикаторов над персонажами с минимальными накладными расходами рендеринга и без затрат, характерных для UMG/Widget-систем.
Выводы
- Грамотный data-oriented дизайн и работа с кэшем позволяют масштабировать AI до сотен тысяч сущностей.
- Многопоточность и продуманное разбиение данных критичны для высокой производительности на CPU.
- Даже UI-элементы (health bars) нужно проектировать с учётом производительности — через instancing и простые материалы.
- В проекте остаётся значительный запас для роста за счёт GPU-вычислений и улучшенных структур ускорения.