Оптимизация без точки невозврата: я сделал плагин для Unreal Engine, который собирает меши в ISM/HISM и умеет откатываться

InstanceForge сканирует уровень, находит повторяющиеся Static Mesh объекты и Static Mesh компоненты внутри Blueprint-акторов, собирает их в ISM/HISM, учитывает LOD и Screen Size, а если результат не подошёл - восстанавливает оригинальные акторы вместе с их настройками, компонентами и кастомными Blueprint-переменными.

Обложка
Обложка

Всем привет.

Я выпустил на Fab свой новый editor-плагин для Unreal Engine - InstanceForge.

Если совсем коротко: это инструмент для оптимизации уровней, где много повторяющихся Static Mesh акторов и компонентов. Он сканирует сцену, находит одинаковые меши, показывает кандидатов для оптимизации и помогает собрать их в ISM / HISM инстансы.

Но главная фишка не только в том, что он умеет собирать инстансы.

Главная фишка в том, что это не точка невозврата.

Обычно с такими инструментами есть понятный страх: нажмёшь “оптимизировать”, сцена изменится, оригинальные акторы пропадут, а потом окажется, что результат не подходит. Или ещё хуже - окажется, что у акторов были кастомные настройки, Blueprint-переменные, варианты, параметры компонентов, и всё это теперь нужно восстанавливать руками.

Поэтому в InstanceForge я сразу сделал build history и восстановление оригинальных акторов. Причём восстановление не просто “поставить меши обратно на места”, а вернуть исходное состояние объектов: компоненты, настройки, значения и кастомные параметры, которые были у акторов до билда.

То есть workflow выглядит не как “нажал и молись”, а нормально:

нашёл повторяющиеся объекты - посмотрел кандидатов - собрал инстансы - проверил результат - откатился обратно, если нужно.

Зачем я его сделал

Когда работаешь с большими уровнями в Unreal Engine, особенно с модульными окружениями, kitbash-сценами или Marketplace demo-сценами, очень быстро появляется одна и та же проблема: в сцене становится слишком много одинаковых объектов.

Ящики, доски, стены, балки, трубы, контейнеры, лампы, декор, куски модульных наборов - всё это часто просто дублируется руками по уровню.

Визуально сцена может выглядеть нормально. Но технически это куча отдельных акторов и компонентов, которые создают лишнюю нагрузку и превращают World Outliner в кладбище повторяющихся объектов.

Большая сцена с большим количеством повторяющихся Static Mesh акторов.
Большая сцена с большим количеством повторяющихся Static Mesh акторов.

Да, в Unreal Engine есть ISM и HISM. Да, можно собирать это руками. Да, можно написать editor script под конкретный проект.

Но на практике часто хочется не “изобрести пайплайн на вечер”, а быстро получить ответ на несколько простых вопросов:

Что в сцене повторяется?
Что из этого можно собрать в инстансы?
Сколько примерно draw calls можно убрать?
Какие группы лучше делать ISM, а какие HISM?
И смогу ли я потом вернуть всё назад вместе с настройками?

InstanceForge как раз про это.

Как работает InstanceForge

Базовый процесс простой:

  1. Выбираете, что сканировать: selected actors, current level или InstanceForge volumes.
  2. Плагин ищет повторяющиеся Static Mesh акторы и компоненты.
  3. Показывает найденные группы и кандидатов для оптимизации.
  4. Позволяет посмотреть build plan перед изменениями.
  5. Даёт выбрать или автоматически подобрать ISM / HISM layout.
  6. Собирает оптимизированные instance clusters.
  7. Сохраняет историю билда, чтобы можно было восстановить оригинальные акторы.
Скан уровня: плагин находит повторяющиеся группы мешей.
Скан уровня: плагин находит повторяющиеся группы мешей.

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

Вы видите группы, количество объектов, примерную экономию draw calls, выбранный layout и можете решить, какие группы собирать, а какие оставить как есть.

Preview build plan перед созданием инстансов.
Preview build plan перед созданием инстансов.

Smart Auto Mode: не просто “собери всё в HISM”

Одна из главных функций плагина - Smart Auto Mode.

Я не хотел делать режим, который просто берёт всё подряд и превращает в HISM. Это не всегда правильный вариант. В одних случаях лучше обычный ISM, в других HISM, где-то нужен split, а где-то группу вообще лучше не трогать.

Smart Auto Mode анализирует найденные группы и подбирает подходящий вариант инстансинга с учётом:

  • LOD-настроек меша;
  • Screen Size;
  • количества LOD-уровней;
  • количества объектов в группе;
  • расположения объектов в сцене;
  • особенностей конкретного меша;
  • предполагаемой выгоды от выбранного layout.

То есть это не магическая кнопка “сделай FPS”, а попытка убрать самую скучную часть работы: ручной перебор десятков одинаковых групп и выбор между ISM / HISM для каждой из них.

Smart Auto Mode выбирает ISM/HISM layout для найденных групп.
Smart Auto Mode выбирает ISM/HISM layout для найденных групп.

При этом ручной контроль остаётся. Можно выбрать Auto, ISM или HISM, включать и отключать группы, менять настройки перед билдом и не отдавать всё на автомат, если нужна точная настройка.

Include / Exclude зоны

Ещё одна полезная штука - InstanceForge volumes.

С их помощью можно указать, какие области уровня нужно обработать, а какие лучше не трогать.

Например, можно просканировать только нужную часть карты, исключить рабочую зону, оставить нетронутыми важные акторы или отдельно проверить конкретный участок большой сцены.

Include Areas - фокус на зоне, которую нужно обработать.
Include Areas - фокус на зоне, которую нужно обработать.
Exclude Areas - область, которую плагин должен пропустить.
Exclude Areas - область, которую плагин должен пропустить.

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

Build: повторяющиеся акторы становятся инстансами

Когда план готов, можно запускать build.

Плагин создаёт оптимизированные instance clusters и заменяет повторяющиеся объекты на ISM / HISM layout в зависимости от выбранных настроек.

Результат: повторяющиеся акторы собраны в optimized clusters.
Результат: повторяющиеся акторы собраны в optimized clusters.

На одном из тестовых уровней в build summary видно, как сцена с большим количеством повторяющихся объектов превращается в намного более компактную структуру.

Но я не хочу продавать это как универсальную кнопку “минус 100% draw calls в любом проекте”. В реальных сценах результат зависит от структуры уровня, материалов, видимости, LOD, платформы и того, где именно находится bottleneck.

InstanceForge решает конкретную задачу:

найти повторяющиеся Static Mesh объекты и помочь аккуратно перевести их в ISM/HISM workflow.

Самое важное: восстановление не только акторов, но и их состояния

Вот это была для меня принципиальная часть.

Оптимизаторы часто пугают тем, что после применения сцена становится “одноразовой”. Вроде бы стало быстрее, но если потом нужно снова редактировать исходные акторы, менять структуру уровня или откатить решение, начинается боль.

Особенно если речь не просто про Static Mesh Actor, а про Blueprint-акторы с кастомными настройками.

Например, у вас есть Blueprint actor, внутри которого выбран конкретный mesh, variant, amount, step или другие параметры. В сцене он выглядит как обычный объект, но на самом деле у него есть свои значения, которые влияют на то, как он собирается, отображается или работает.

Если такой объект просто удалить и заменить чем-то другим без возможности восстановления, это уже риск.

Поэтому InstanceForge сохраняет build history и умеет восстанавливать не просто “объекты на прежних местах”, а исходное состояние акторов и компонентов.

При восстановлении плагин возвращает оригинальные акторы, их компоненты и важные значения, которые были у них до билда. Это включает не только базовые вещи вроде transform, mesh/material settings и настроек компонентов, но и кастомные параметры Blueprint-акторов: переменные, пользовательские настройки, выбранные варианты и другие данные, которые были частью исходного объекта.

Build history и rollback restore.
Build history и rollback restore.
Восстановление кастомных значений: Blueprint Mesh, Variant, Amount, Step.
Восстановление кастомных значений: Blueprint Mesh, Variant, Amount, Step.

То есть если у вас в сцене были не просто одинаковые Static Mesh Actors, а Blueprint-акторы с собственными настройками, InstanceForge старается вернуть их обратно в том виде, в котором они были до оптимизации.

Это важно не только для безопасности, но и для нормального production workflow. Можно прогнать оптимизацию, посмотреть результат, протестировать сцену, а потом решить - оставлять оптимизированные instance clusters или откатиться к исходной структуре уровня с оригинальными настройками.

Разумеется, для production-карт всё равно стоит использовать source control и делать бэкапы перед крупными editor-операциями. Это нормальная привычка для любых серьёзных изменений в уровне.

Но сам факт, что плагин умеет восстанавливать не только акторы, а ещё и их пользовательское состояние, сильно меняет ощущение от работы. Это уже не “собрал и потерял исходники”, а нормальный обратимый editor workflow.

Для кого это может быть полезно

В первую очередь InstanceForge рассчитан на тех, кто работает с уровнями и окружением:

  • level designers;
  • environment artists;
  • technical artists;
  • solo-разработчики;
  • инди-команды;
  • разработчики, которые часто используют Marketplace-ассеты;
  • те, кто чистит demo-сцены перед использованием в проекте.

Особенно хорошо плагин ложится на:

  • модульные окружения;
  • kitbash-сцены;
  • большие уровни с повторяющимися пропсами;
  • техническую чистку перед optimization pass;
  • ситуации, где в сцене много одинаковых Static Mesh акторов, раскиданных по карте.

Если вы открывали большую Marketplace demo-сцену и видели там тысячи повторяющихся объектов в Outliner, вы примерно понимаете, какую боль я пытался закрыть.

Чего он не делает

Сразу честно: InstanceForge не является “оптимизацией всего проекта в один клик”.

Если сцена упирается в тяжёлые материалы, динамические тени, Niagara, физику, скрипты, streaming, неправильные LOD или дорогие постпроцессы, один инстансинг не исправит всё.

Плагин закрывает более конкретную задачу:

повторяющиеся Static Mesh акторы и компоненты - найти, сгруппировать, превратить в ISM/HISM, сохранить возможность восстановления.

И мне кажется, в этом его плюс. Он не пытается быть магией. Он просто убирает рутину из понятного editor workflow.

Плагин работает с Unreal Engine 4.27 - 5.7.

Я отдельно заморочился с поддержкой разных версий движка, потому что далеко не все проекты сидят на самой свежей версии UE. Кто-то до сих пор работает на 4.27, кто-то на промежуточных UE5, кто-то уже смотрит в сторону 5.7.

InstanceForge рассчитан на широкий диапазон проектов, а не только на последнюю версию движка.

Где посмотреть

Итог

InstanceForge - это editor-плагин для Unreal Engine, который помогает оптимизировать сцены с большим количеством повторяющихся Static Mesh объектов.

Главные вещи:

  • скан уровня;
  • поиск повторяющихся мешей;
  • preview кандидатов;
  • ISM / HISM build;
  • Smart Auto Mode с учётом LOD и Screen Size;
  • include / exclude volumes;
  • build history;
  • восстановление оригинальных акторов;
  • восстановление компонентов, кастомных настроек и Blueprint-переменных;
  • поддержка UE 4.27 - 5.7.

Я делал его в первую очередь как практичный инструмент для реальной работы с уровнями: быстро найти повторяющиеся объекты, собрать их в инстансы и не бояться, что сцену нельзя будет вернуть обратно.

Буду рад фидбеку, вопросам и замечаниям от Unreal-разработчиков.

10
7
13 комментариев