Unreal EngineMiddleExperience

Расскажите о случае, когда вы решали проблему с Unreal Engine: incident, optimization, migration, debugging или CI/CD.

Оптимизировал open-world игру с падением FPS: через stat unit и Unreal Insights выявил 4500+ draw calls от отдельных Static Mesh акторов, заменил их на Hierarchical Instanced Static Mesh — draw calls снизились до 12 при той же сцене.

Решение production-проблем в Unreal Engine

Один из наиболее показательных случаев — оптимизация производительности в open-world игре, где framerate падал с 60 до 15-20 FPS в конкретных локациях после добавления нового биома.

Диагностика через Unreal Insights

Первый шаг — профилирование через встроенные инструменты:

# Запуск Unreal Insights trace
# В редакторе: Tools -> Run Unreal Insights
# Или через консоль (`) в рантайме:
trace.start
trace.stop

# Быстрый профайлинг через консольные команды:
stat unit          # Frame/Game/Draw/GPU время
stat fps           # FPS counter
stat scenerendering # Draw calls и примитивы
stat initviews     # Culling статистика

Выявленная проблема: draw calls

Профайлер показал 4500+ draw calls в проблемных зонах против нормальных 800-1200. Причина — отдельные Static Mesh Actor для каждого кустика и камня без инстансинга.

Решение: Hierarchical Instanced Static Mesh

// Заменили отдельные акторы на HISM
// В Blueprint или C++:

// Добавление компонента HISM
UHierarchicalInstancedStaticMeshComponent* HISMComp;
HISMComp = CreateDefaultSubobject<UHierarchicalInstancedStaticMeshComponent>(TEXT("VegetationHISM"));
HISMComp->SetStaticMesh(BushMesh);

// Добавление тысяч инстансов одним draw call
for (const FTransform& Transform : VegetationTransforms)
{
    HISMComp->AddInstance(Transform);
}
// Результат: 4500 draw calls -> 12 draw calls для всей растительности

LOD настройка

# В Static Mesh Editor:
# LOD 0: 0-30м, полная детализация
# LOD 1: 30-80м, 50% полигонов  
# LOD 2: 80-200м, 20% полигонов
# LOD 3: 200м+, impostor (billboard)

# Проверка LOD в рантайме:
show LOD          # Визуализация LOD уровней цветом
r.ForceLOD 2      # Принудительный LOD для тестирования

CI/CD для Unreal Engine проекта

После оптимизации настроили автоматизированную сборку:

# Jenkinsfile / GitHub Actions step
# Unreal Automation Tool (UAT) для сборки
"$UE_ROOT/Engine/Build/BatchFiles/RunUAT.sh" BuildCookRun \
  -project="/path/to/MyGame.uproject" \
  -platform=Win64 \
  -configuration=Shipping \
  -cook -build -stage -pak \
  -archive -archivedirectory="/output"

Подводные камни

  • Unreal Insights требует отдельного запуска до старта игры — запустить trace post-factum нельзя.
  • HISM не подходит для объектов, которые нужно индивидуально анимировать или удалять — используйте ISM или отдельные акторы.
  • Перепечение освещения (Lightmass) при каждом изменении уровня занимает часы — настройте GPU Lightmass или используйте Lumen для динамического освещения.
  • World Composition (до UE5) и World Partition (UE5+) конфликтуют — не смешивайте подходы при миграции.
  • Blueprint VM медленнее нативного C++ в 10-100x для tick-heavy логики — выносите частые вычисления в C++.
  • Unreal использует правостороннюю систему координат с Z-вверх — импорт ассетов из Maya/Blender (Y-вверх) требует явной настройки экспорта.
  • Garbage Collection в UE4/5 останавливает мир на 5-15ms — не создавайте тысячи UObject в tick; используйте пулинг.
  • Package size Shipping билда: Unreal включает много неиспользуемого — настройте Project Packaging, исключите тестовые карты и debug assets.

What hurts your answer

  • Выдумывать опыт или говорить слишком общими фразами
  • Не объяснять свою личную роль в работе с Unreal Engine
  • Не показывать результат, метрики или извлечённые уроки

What they're listening for

  • Может подготовить честный пример использования Unreal Engine
  • Показывает свою роль, решения и результат
  • Умеет рефлексировать над trade-offs и уроками

Related topics