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 и уроками