15.9K Views
July 31, 25
スライド概要
2025年6月にリリースしたUnreal Engine 5(UE5)の最新バージョン、UE5.6では、高精細かつ大規模なオープンワールドを60FPSで動作させるための様々な最適化が行われています。
本スライドでは、UE5.6で行われたアップデートを中心にLumenやNaniteでリッチなグラフィックを実現しつつ60FPSを達成するための設定やテクニックを紹介します。
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
Unreal Engine 5.6 最新アップデート オープンワールドで 60FPS を達成するための最適化 Senior Software Engineer, Developer Relations Takashi Suzuki Software Engineer, Developer Relations Yutaro Sawada
Nanite オープンワールド開発 Unreal Engine 5 は シームレスで広大なワールドを実現する手段を エンジンに含めてリリースされました Chaos WorldPartation Zen PCG Lumen
「今までにない 圧倒的なビジュアル の実現」
〇〇km x 〇〇km位の 広さは欲しい もちろん密林は必須 「今までにない 圧倒的なビジュアル の実現」 ランドスケープ感の無い フィールド イキイキとした市街地
ワールドの密度は ● ● ● ● ● GPUワークロードの増大 メモリ消費量の増大 ストリーミングパフォーマンス ガベージコレクション 全体的なパフォーマンスの低下
「60FPSはマストで」
Unreal Engine 5.6の登場
STATE OF UNREAL 2025 4K | Unreal Fest Orlando @Youtube https://www.youtube.com/watch?v=ubCXb9BHhbE
Table of contents ストリーミングの改善 移動処理の並列化 グラフィックスの改善
ストリーミングの改善
比較動画
ワールド パーティション 広大でシームレスな世界を実現するための仕組み 複数の開発者による同時編集 ランタイム用のセル自動分割 RuntimePartitionLHGridの追加 (UE5.4) 遠景表示用のHLOD生成
高密度なワールドでの問題点 開発中に遭遇しえる数々の課題 メモリとの戦い セルのロード時間 ヒッチの増加 どの程度のロード距離を設定するべきか 各各セルのロード時間が長くなり、高速に移 動すると読み込みが間に合わなくなる ガベージコレクション セルのコンテンツの登録/解除 ストリーミングプール
ストリーミングの改善 5.6で導入された改善点 UnifiedStreamingBudget 非同期 PhysicsState生成 ゲームスレッド上の処理の許容時間 をより適切に各処理に分配 ワーカースレッドに処理をオフロード し、数倍の登録処理をヒッチ無しで処 理できるように RuntimeCellTransfomer FastGeo プラグイン セル内のコンテンツをより効率の良 い形式に変形 さらに随所に並列処理を実装
ストリーミングの改善 5.6で導入された改善点 UnifiedStreamingBudget 非同期 PhysicsState生成 ゲームスレッド上の処理の許容時間 をより適切に各処理に分配 ワーカースレッドに処理をオフロード し、数倍の登録処理をヒッチ無しで処 理できるように RuntimeCellTransfomer FastGeo プラグイン セル内のコンテンツをより効率の良 い形式に変形 さらに随所に並列処理を実装
タイムライン Request 16.6ms GameThread 16.6ms
タイムライン Request GameThread AsyncLoading IO
タイムライン Request ProcessAsyncLoading AddToWorld PhyssicsState 生成 GameThread AsyncLoading IO RenderState 生成
タイムライン Request 次のRequest ProcessAsyncLoading ProcessAsyncLoading AddToWorld PhyssicsState 生成 RenderState 生成 RemoveFromWorld GameThread AsyncLoading IO AsyncLoading IO
タイムライン Request 次のRequest ProcessAsyncLoading ProcessAsyncLoading AddToWorld RemoveFromWorld 16.6ms 16.6ms 16.6ms GameThread AsyncLoading IO AsyncLoading IO
セルのロードにおけるゲー ムスレッド上の 処理時間割り当て設定 それぞれが個別に時間予算を持つ 単純に予算を下げると、処理完了までが遅延してしまう ;ProcessAsyncLoading予算 s.AsyncLoadingTimeLimit=5.0 s.PriorityAsyncLoadingExtraTime=15.0 ;AddToWorld予算 s.LevelStreamingActorsUpdateTimeLimit=5.0 ;RemoveFromWorld予算 s.UnregisterComponentsTimeLimit=1.0
ProcessAsyncLoading 5ms AddToWorld 5ms RemoveFromWorld 1ms
UnifiedStreamingBudget ゲームスレッドで時分割処理されている ● ProcessAsyncLoading ● AddToWorld ● RemoveFromWorld の処理時間を統一して割り振る仕組み s.UseUnifiedTimeBudgetForStreaimg=true s.AsyncLoadingTimeLimit=5.0 s.LevelStreamingActorsUpdateTimeLimit=1.0 合計値 s.PriorityAsyncLoadingExtraTime=5.0 s.PriorityLevelStreamingActorsUpdateExtraTime=1.0 合計値
AsyncLoading UnifiedStreamingBudget AddToWorld
UnifiedStreamingBudget ヒッチの改善 セルのロードレスポンスの改善
改善点 UnifiedStreamingBudget 非同期物理ステート生成 ゲームスレッド上の処理の許容時間 をより適切に各処理に分配 ワーカースレッドに処理をオフロード し、数倍の登録処理をヒッチ無しで処 理できるように RuntimeCellTransfomer FastGeo プラグイン セル内のコンテンツをより効率の良 い形式に変形 さらに随所に並列処理を実装
物理ステート生成負荷 セルをストリーミングした時に大量の物理ステートが生成され、ゲーム スレッドを占有する問題 プロシージャル生成でばら撒かれる、 スタティックメッシュや ISMで発生しやすい コリジョンを無効化しても良いものは積極的に NoCollisionに設定する ことも重要
非同期物理ボディ生成 物理ステート生成処理を ワーカースレッドにオフロード セルロード時のヒッチの改善 p.Chaos.EnableAsyncInitBody=true LevelStreaming.AllowIncrementalPreRegisterComponents=true LevelStreaming.AllowIncrementalPreUnregisterComponents=true
次のTickに間に合わないと 移動処理などが物理ワールドのロック待ちでブ ロックされる可能性 AddToWorld AsyncInitBody
改善点 UnifiedStreamingBudget 非同期 PhysicsState生成 ゲームスレッド上の処理の許容時間 をより適切に各処理に分配 ワーカースレッドに処理をオフロード し、数倍の登録処理をヒッチ無しで処 理できるように RuntimeCellTransfomer FastGeo プラグイン セル内のコンテンツをより効率の良 い形式に変形 さらに随所に並列処理を実装
Streaming Improvements for Dense Worlds @ Unreal Fest Orlando 2025 https://youtu.be/zP3er6tA6Ks?t=11345
RuntimeCellTransformer ワールドパーティションによって生成された 各セルのコンテンツを加工する ● ● ● ● アクター/コンポーネントの追加変更削除 編集対象のワールドのコンテンツは変更しない セルの追加は出来ない グリッドやセルの分割には干渉できない
ワールド RuntimeHash RuntimeCellTransformer の動作 WorldPartition Cells Serialize Cells To Streaming Levels PIE Cooker Package
ワールド RuntimeHash RuntimeCellTransformer の動作 WorldPartition Cells Cell Transformer Transformed WorldPartition Cells Serialize Cells To Streaming Levels PIE Cooker Package
RuntimeCellTransformer の動作 ワールド Cell Transformer RuntimeHash Transformed WorldPartition Cells WorldPartition Cells Cell Transformer Transformed WorldPartition Cells PIE ・・・ Serialize Cells To Streaming Levels Cooker Package
設定 ● ● スタック構造 各CellTransformerにパラメータを設定
独自のTransformer 非常に自由度が高くパワフルな機能なので実装には細心の注意を 十分なデバッグ機能や検証機能を組み込む アイデア ● コリジョンの最適化 ● インスタンス化 ● パラメータの加工 ● カスタムコンポーネントへの変換
エンジン組み込み実装 WorldPartitionRuntime CellTransformerISM 対象のスタティックメッシュを ISM化し さらに一つのアクターにまとめる コンポーネント数の減少 サンプルとしても
FastGeoStreaming プラグイン Experimental
FastGeo FastGeoWorldPartition RuntimeCellTransformer 高性能 Transformer ● 静的なスタティックメッシュを非 UObject型の FPrimitiveSceneProxyDescに変換する ● 専用のコンテナに格納 ● ストリーミングの動作を乗っ取って改善 ○ 非同期生成
FastGeo FPrimitiveScneProxyDesc アクターやコンポーネントなどを使わずに 軽量な構造体を直接レンダラーに 登録して描画を行う仕組み セルロード時の CPU負荷最適化 SceneProxy非同期生成RenderState) UObject数が大きく減少 → ガベージコレクション最適化 省メモリ化
UnrealEngine5のCPU最適化テクニック @ Docswell https://www.docswell.com/s/EpicGamesJapan/ZN1982-2024-12-09-104909#p39
FastGeo 対応フォーマット 対応アクター ● AStaticMeshActor ● APackedLevelActor ● AWorldPartitionHLOD ● AWorldPartitionAutoInstancedActor ● 指定したアクター ● FastGeoActorTag 対応コンポーネント ● UStaticMeshComponent ● UInstancedStaticMeshComponent ● UHierachicalInstancedStaticMeshComponent ● USkinnedMeshComponent ● UInstancedSkinnedMeshComponent
FastGeo コンテンツ生成とコンテナ 通常のパッケージ化されたセル FastGeoで変換されたセル 変換されなかった アクター アクター FastGeoContainer アクター FastGeoComponent HLODs FastGeoHLOD
FastGeo デバッグ用コンソールコマンド FastGeo.Show 1/0 パッケージビルドでも利用可能 Show ActorColoration FastGeo FastGeo.EnableTransformer DebugMode 1/0 PIEで利用 なぜ変換されないかなどがログに出力 される
ランタイムセル生成の前段 でアセットに加工を加える
※詳しくはUnrealFestの動画を参照
その他のアップデート
Mutator
ランタイムグリッドの自動割り当て
最適なグリッドに割り振ることで省メモリ化など
常駐化IsSpatiallyLoaded)の自動切り替え
Cで実装しフックする
// ActorDescs Mutator を登録 (WorldSubSystemなどから EditorWorldに登録する )
World->GetWorldPartition()->OnGenerateStreamingActorDescsMutatePhase.AddUObject
(this, &UMyActorDescMutator::HandleStreamingGenerationMutatorPhase);
// 実装
void UMyActorDescMutator::HandleStreamingGenerationMutatorPhase
(const IStreamingGenerationContext* Context, TArray<FActorDescViewMutatorInstance>&
OutActorDescsMutators Instances)
{...}
その他のアップデート テクスチャストリーミング FSimpleStreamableAssetManager テクスチャのミップマップの管理やメッシュストリーミングの更新処理を 非同期化または並列化 ゲームスレッドの負荷軽減 ;更新処理をワーカースレッドにオフロード s.StreamableAssets.UseSimpleStreamableAssetManager=1 ;テクスチャのサンプリング密度をキャッシュ(パッケージビルドのみ) r.Streaming.EnableTexturesSamplingStreamingCache=1 ;ストリーミングマネージャへの登録処理を並列化(パッケージビルドのみ) r.Streaming.AllowParallelRenderAssetStreamingManagerIncrementalUpdate=1 r.Streaming.WorkerCountForParallelRenderAssetStreamingManagerIncrementalUpdate=4
その他のアップデート ワールドパーティション の更新 ワールドパーティションのセルの状態更新を非同期化 EndPlayの時分割 FastGeoに含まれない SceneProxy生成もマルチスレッド化 ゲームスレッドの負荷軽減 ;ワールドパーティション更新をワーカースレッドに wp.runtime.UpdateStreaming.EnableAsyncUpdate = 1 ;EndPlay処理を時分割可能に s.LevelStreamingRouteActorEndPlayForRemoveFromWorldGranularity = 1 ;AddPrimitive(SceneProxy生成)をマルチスレッド化 LevelStreaming.AsyncRegisterLevelContext.Enabled = 1 LevelStreaming.AsyncRegisterLevelContext.PrimitiveBatchSize = 8
ストリーミングの改善 サンプルについて UE5.6版のCitySampleは今日紹介した最適化が適用済みです 7/22現在、まだランチャーからダウンロードできる状態に なっていないので、 P4にアクセス可能な方は //UE5/Release-5.6.0/Samples/Showcases/CitySample からダウンロードしてください。
移動処理の並列化
CharacterMovementComponent ● ● ● ● キャラクター用の移動コンポーネント 非常に高機能 ネットワークの同期機能 ゲームスレッド上で動作 ○ 多数のキャラクターを動かそうとすると ボトルネックになりやすい
CharacterMovementComponent ● ● ● ● キャラクター用の移動コンポーネント 非常に高機能 ネットワークの同期機能 ゲームスレッド上で動作 ○ 多数のキャラクターを動かそうとすると ボトルネックになりやすい →マルチスレッドに分散したい!
Mover Plugin Experimental 開発中の次世代移動コンポーネント
Project Titanから学ぶオープンワールドワークフローと 次世代移動コンポーネントMoverの設計 @ Docswell https://www.docswell.com/s/EpicGamesJapan/KYD6XR-2025-04-14-113909#p43
ネットワーク同期を含む移動のベース処理を定義 BackendLiaison MoverStandaloneLiaisonComponentに 非同期処理が追加
有効化
[ConsoleVariables] mover.standalone.RunProduceInputOnAnyThread=true mover.standalone.RunMovementSimOnAnyThread=true 有効化
グラフィックスの改善
初期設定の見直し、最適化 各種機能の並列化等アルゴリズムレベルでの改善 UE 5.6~ グラフィックス関係の アップデートについて 各種機能のアップデート Lumen, Nanite, VSM, Virtual Texture,~ GPU Profiler 2.0 プロファイラの改善
UE 5.6 GPU Profiler 2.0 追加機能の紹介 本日の内容 各種機能のアップデート Lumen, Shadow, Translucency Lighting Volume
UE 5.6 GPU Profiler 2.0 ● 再設計された Insights GPU ● 非同期キューの対応 ● 依存関係Fenceの可視化
GPU Insightsの開き方 これまでと同様に... Gameを引数-trace=gpu 付きで起動 -> UnrealInsights.exeからトレース Editorの場合は右下のトレースボタンチャンネルを確認 -> UnrealInsightsを起動し、トレース を開始
追加された非同期キュー
表示オプションについて
Fenceの可視化機能
1フレーム全体の関係性 Fenceの可視化
パス毎の関係性 Fenceの可視化
GpuWork、GpuWait
ボトルネックを見つけるための強力なツール 現在のGPU処理は非常に非同期処理が多い よりクリティカルなボトルネックを見つけることが必要に 解像度の固定化 r.DynamicRes.TestScreenPercentage 60 r.screenpercentage 60 非同期処理のオフ r.RDG.AsyncCompute 0
Insightsでデータが取れない時はバージョンを確認
UE5.6のUnreal Insightsは v1.07
Unreal Insightsについて詳しく知りたい方は
UE 5.6 Lumen - HWRTの強化 ● Lumen mesh cardのSkeletal Mesh対応 ● Ray Tracing Proxyの改善 ● Extra Ambient Occlusion ● Shader Execution Reordering SERの対応
Lumen mesh cardのSkeletal Mesh対応 r.MeshCardRepresentation.SkeletalMesh 1(デフォルト有効)
Screen Space無しLumen Reflection Surface Cache利用時、Screen Space無しでもSkeletal Meshの反射が利用可能に
Mesh Cardによる簡易表現や遅延等の懸念はあるが、アーティファクトは減る
Lumen Mesh Card更新の最適化 ・自身のカードでより小さいものがリクエストされている場合、ダウンサンプルで作成 r.LumenScene.SurfaceCache.AllowCardDownsampleFromSelf 1 インスタンス可能なものは、コピーで生成を行う(カードシェアリング) r.LumenScene.SurfaceCache.AllowCardSharing 1 PerInstanceRandom /PerInstanceCustomData /WorldPosition /ActorPositionWS が使われているとそれぞれでラスタライズが必要になる r.LumenScene.SurfaceCache.DetectCardSharingCompatibility 1 距離指定で優先的にライティングを更新 r.LumenScene.Lighting.MaxDistanceFromFrustumToPrioritize 500
Ray Tracing Proxy
Ray Tracing Proxyとは ハードウェアレイトレーシングを行う時にヒットポイントを求めるメッシュ 従来は、Naniteが利用できない環境で Nanite Meshの代わりに表示される(Nanite) Fallback Meshと兼用
Ray Tracing Proxyが別途作成できるように LOD0に加えて更に軽量化したLOD1を同時に作成可能
Autoの設定 Nanite Fallback用Auto設定値 r.Nanite.Builder.FallbackTargetAutoRelativeError 1 RayTracingProxy用Auto設定値 r.Nanite.Builder.RayTracingProxy.FallbackTargetAutoRelativeError 2 RelativeError 1 RelativeError 2
プロジェクト設定から一括有効化
LOD1を用意することのメリット レイトレーシングのBLASを一定のメモリプールサイズに抑える機能がUE5.5から導入 r.RayTracing.UseReferenceBasedResidency r.RayTracing.ResidentGeometryMemoryPoolSizeInMB 使われていないものはLOD1に置き換えて削減可能なため、LOD1が重要 r.RayTracing.NumAlwaysResidentLODs 1
Extra Ambient Occlusion
Lumen の Ambient Occlusion ShortRangeAO SSAO
ShortRangeAO LumenGIに含まれるAO r.Lumen.ScreenProbeGather.ShortRangeAO 1 r.Lumen.ScreenProbeGather.ShortRangeAO.DownsampleFactor 2
SSAO ShortRangeAOを無効化したうえで利用可能な、スクリーンスペースのAO r.Lumen.ScreenProbeGather.ShortRangeAO 0 r.Lumen.DiffuseIndirect.SSAO
Extra Ambient Occlusion LumenGIを使いつつ強めにAOを乗せる事が可能 r.Lumen.ScreenProbeGather.ExtraAmbientOcclusion
比較 ShortRangeAO SSAO Extra Ambient Occlusion
Shader Execution Reordering
Shader Execution Reordering(SER)対応 Lumenが、Shader Execution Reordering(SER)に対応 NVIDIAの対応ハードウェア(Ada世代以降)のみですが、複雑なシーンで処理速度が向上 r.Lumen.HardwareRayTracing.ShaderExecutionReordering デフォルト有効
Electric Dream (Editor実行) 検証環境 CPU: Ryzen 9 7950x RAM: 128 GB GPU:Geforce RTX 5090
オンオフの比較 r.Lumen.HardwareRayTracing.ShaderExecutionReordering 0 r.Lumen.HardwareRayTracing.ShaderExecutionReordering 1
UE 5.6 Shadowに関するアップデート ● DOFによるVSM解像度変更 ● Shadow Fade挙動の変更
DOFによるVSM解像度変更 r.Shadow.Virtual.MaxDOFResolutionBias (0を設定することで無効化、値を大きくすると解像度は低下)
DOFの機能追加 - ペッツバール湾曲ボケ
ShadowMaps(非VSM)Shadow Fade挙動の変更 Shadow FadeがライトのResolution Scaleに連動するように r.Shadow.DoesFadeUseResolutionScale true (デフォルト有効化、Falseが5.6以前の挙動) r.Shadow.FadeResolutionやr.Shadow.MinResolutionで制御可能なFade機能
UE 5.6 Translucency Lighting Volume のアップデー ト ● デバッグビューの追加 ● 部分更新機能 MarkVoxels)
デバッグビューの追加
部分更新機能(MarkVoxels) サンプリングされた箇所をマークして更新する機能 r.TranslucencyLightingVolume.MarkVoxels 1 CPU: Intel Core i7 11850H RAM: 32 GB GPU:NVIDIA Geforce RTX 3070 Laptop
最適化可能な箇所 CPU: Intel Core i7 11850H RAM: 32 GB GPU:NVIDIA Geforce RTX 3070 Laptop ライト:100個、TLV-DIM:128
まとめ
Thank you! EPIC GAMES JAPAN