Asset Streaming

Asset Streaming

Memory-safe content delivery with Async Loading

Manage heavy content by Primary Assets, bundle rules, and asynchronous handles to keep frame pacing stable.

Потоковая загрузка ассетов

Memory-safe доставка контента через Async Loading

Управляйте тяжелым контентом через Primary Assets, правила bundle и асинхронные handles, чтобы удерживать стабильный frame pacing.

Video Walkthrough

Видеообзор

Shared UE5 explainer video for this section.

Общее объясняющее видео по UE5 для этого раздела.

Asset Manager Strategy

Define gameplay-ready bundles (`Default`, `UI`, `Audio`) to load minimal sets based on phase transitions.

Определяйте gameplay-ready bundles (`Default`, `UI`, `Audio`) и загружайте минимальные наборы по фазам игры.

Soft References

Use `TSoftObjectPtr` and `FPrimaryAssetId` to avoid startup spikes from hard object references.

Применяйте `TSoftObjectPtr` и `FPrimaryAssetId`, чтобы убрать стартовые пики от жестких ссылок.

Recommended loading flow

  1. 1. Resolve `FPrimaryAssetId` for zone-specific bundles.
  2. 2. Request async handles with high-priority tags for blocking gameplay dependencies.
  3. 3. Warm-up animation blueprints and Niagara systems before player control is granted.
  4. 4. Release handles only after hand-off systems confirm no pending references.

Note

Async Loading Thread throughput depends on package granularity. Keep package sizing consistent.

Пропускная способность Async Loading Thread зависит от гранулярности пакетов. Держите размер пакетов консистентным.

Warning

Hard references from UI widgets to world assets can silently disable streaming benefits.

Жесткие ссылки из UI-виджетов на world-ассеты могут незаметно свести пользу стриминга к нулю.

Tip

Track load stalls by category and gate cinematic transitions with explicit readiness signals.

Отслеживайте stalls по категориям и блокируйте cinematic-переходы до явного сигнала готовности.

Source/Streaming/ZoneStreamingService.cpp
void UZoneStreamingService::PreloadZone(const FPrimaryAssetId& ZoneAssetId)
{
  const TArray<FName> Bundles = { TEXT("Default"), TEXT("Audio") };

  PendingHandle = UAssetManager::Get().LoadPrimaryAsset(
    ZoneAssetId,
    Bundles,
    FStreamableDelegate::CreateUObject(this, &UZoneStreamingService::OnZoneReady),
    FStreamableManager::AsyncLoadHighPriority
  );
}