Назад к блогу

Как освоить Asset Stripping в Unreal Engine Dedicated Server (Пошаговое руководство)

Опубликовано 17 марта 2026 г.
Как освоить Asset Stripping в Unreal Engine Dedicated Server (Пошаговое руководство)

Вы запускаете свежесобранный Unreal Engine dedicated server, ожидая увидеть легковесный headless-процесс. Но заглянув в memory profile, вы обнаруживаете тысячи объектов UMaterial, UTexture и USoundWave, занимающих оперативную память.

Официальная документация гласит, что headless-сервер не рендерит графику. Почему же тогда он потребляет мегабайты данных текстур?

Каждый инди-разработчик знает момент, когда расходы на хостинг начинают угрожать бюджету проекта. Когда bare-metal сервер из-за memory bloat может запустить только 10 инстансов игры вместо 50, ваша архитектура backend под угрозой.

В этом материале мы разберем, как на самом деле работает unreal engine dedicated server asset stripping, почему ghost assets остаются в памяти и как спроектировать C++ и Blueprints так, чтобы полностью их искоренить.

Анатомия «Ghost Asset» на Dedicated Server

Чтобы решить проблему, нужно понять, что делает Unreal Automation Tool (UAT) при кукинге (cook) для таргета Server.

Unreal Engine разделяет ассеты на две части:

  1. UObject Wrapper: метаданные, свойства и данные рефлексии.
  2. Bulk Data: тяжелые данные (сжатые пиксели DXT для текстур, vertex buffers для мешей, PCM-данные для аудио).

При сборке dedicated server кукер успешно удаляет bulk data. Данные для рендеринга исчезают. Однако UObject wrapper остается.

Если Blueprint Class Default Object (CDO) имеет hard reference на UTexture2D, сервер обязан создать экземпляр UObject UTexture2D для работы системы рефлексии и предотвращения падений из-за null pointer. Даже если bulk data удалены и текстура занимает 1 КБ вместо 10 МБ, создание 50 000 таких объектов приводит к значительному memory bloat и нагрузке на Garbage Collection.

Аудио и частицы работают так же?

Да. Если есть hard reference на USoundCue или UNiagaraSystem, сервер загрузит UObject. Тяжелые PCM-данные будут удалены, но объект останется. В случае с частицами это опасно: если система содержит логику на CPU, сервер может продолжать ее обрабатывать (tick), тратя ресурсы процессора.

Шаг 1: Профилирование Memory Bloat сервера

Вы не можете оптимизировать то, что не можете измерить. Запустите сервер с аргументами:

-LLM -LLMCSV -memoryprofiler

В консоли сервера выполните memreport -full. В сгенерированном файле ищите Obj List. Вы увидите список классов и объем занимаемой ими памяти.

Шаг 2: Замена Hard References на Soft Pointers

Основная причина появления ghost assets — жесткие ссылки. В C++ используйте TSoftObjectPtr. Soft references хранят только путь к ассету, и UObject не загружается в память, пока вы явно не вызовете LoadSynchronous() (что нужно делать только на клиенте).

ПРАВИЛЬНО: Soft Reference (Сервер остается чистым)

UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "UI")
TSoftObjectPtr<UTexture2D> HeroPortraitSoft;

Шаг 3: Использование NeedsLoadForServer

Вы можете приказать системе упаковки полностью игнорировать визуальные компоненты на сервере, переопределив функцию NeedsLoadForServer и возвращая false.

Шаг 4: Стриппинг аудио и частиц через конфиг

В DefaultEngine.ini можно исключить целые папки из кукинга для сервера с помощью +DirectoriesToNeverCook. Также в *.Target.cs файле сервера можно отключить аудио движок: bDisableAudio = true;.

Best Practices

  1. Разделяйте коллизии и визуальные меши: Используйте упрощенный UStaticMesh для сервера.
  2. Аудит Construction Scripts: Используйте Switch Has Authority, чтобы сервер не создавал визуальные эффекты.
  3. Изолируйте Data Assets: Разделяйте данные о характеристиках и визуальные данные.
  4. Автоматизируйте профилирование в CI/CD: Проверяйте потребление памяти при каждой сборке.

Масштабирование оптимизированного Backend

Снижение потребления памяти с 800 МБ до 180 МБ — это огромная победа. Теперь вы можете запустить в 4-5 раз больше инстансов на том же оборудовании, сокращая расходы на AWS или Google Cloud.

Вместо того чтобы тратить месяцы на создание своей инфраструктуры оркестрации, попробуйте horizOn. Загрузите ваш оптимизированный билд, и horizOn возьмет на себя глобальное масштабирование и управление флотом.

Заключение

Asset stripping в Unreal Engine — мощный инструмент, но он зависит от вашей архитектуры. Используя soft pointers и разделяя визуальные данные и логику, вы добьетесь производительности, необходимой для мультиплеерных игр.

Готовы к масштабированию? Попробуйте horizOn бесплатно или изучите нашу API документацию.


Источник: Stripping asset on dedicated server