More Related Content
Similar to 『FINAL FANTASY VII REMAKE』におけるプロファイリングと最適化事例 UNREAL FEST EXTREME 2021 SUMMER (20)
More from エピック・ゲームズ・ジャパン Epic Games Japan (20)
『FINAL FANTASY VII REMAKE』におけるプロファイリングと最適化事例 UNREAL FEST EXTREME 2021 SUMMER
- 1. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
© 1997, 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
CHARACTER DESIGN:TETSUYA NOMURA/ROBERTO FERRARI
LOGO ILLUSTRATION:©1997 YOSHITAKA AMANO
- 3. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
※「Unreal Engine 4」は Epic games, Inc. の商標または登録商標です。
- 9. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
© 1997, 2020 SQUARE ENIX CO., LTD. All Rights Reserved.
CHARACTER DESIGN:TETSUYA NOMURA/ROBERTO FERRARI
- 11. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
© 1997, 2020 SQUARE ENIX CO., LTD. All Rights Reserved.
CHARACTER DESIGN:TETSUYA NOMURA/ROBERTO FERRARI
- 14. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
© 1997, 2020 SQUARE ENIX CO., LTD. All Rights Reserved.
CHARACTER DESIGN:TETSUYA NOMURA/ROBERTO FERRARI
- 16. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
いずれかの条件でQAからバグとして報告されてしまう!!
条件1
条件2
- 17. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
QA
プロファイリング担当
修正担当者
(アーティスト・プログラマ)
- 24. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
Thread 優先度 アフィニティマスク
GameThread TPri_Normal MAKEAFFINITYMASK1(0)
RenderingThread TPri_Normal MAKEAFFINITYMASK1(1)
RHIThread TPri_Normal MAKEAFFINITYMASK1(2)
TaskGraphThread TPri_SlightlyBelowNormal MAKEAFFINITYMASK7(0, 1, 2, 3, 4, 5, 6)
PoolThread TPri_Lowest MAKEAFFINITYMASK4(3, 4, 5, 6)
AsyncLoadingThread TPri_BelowNormal MAKEAFFINITYMASK5(2, 3, 4, 5, 6)
- 27. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
void UParticleSystemComponent::TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction)
{
// 省略...
AsyncWork = TGraphTask<FParticleAsyncTask>::CreateTask(nullptr, ENamedThreads::GameThread).ConstructAndDispatchWhenReady(this);
ThisTickFunction->GetCompletionHandle()->DontCompleteUntil(AsyncWork);
// 省略...
}
class FParticleAsyncTask
{
// 省略...
void DoTask(ENamedThreads::Type CurrentThread, const FGraphEventRef& MyCompletionGraphEvent)
{
FGraphEventRef Finalize = TGraphTask<FParticleFinalizeTask>::CreateTask(nullptr, CurrentThread).ConstructAndDispatchWhenReady(Target);
MyCompletionGraphEvent->DontCompleteUntil(Finalize);
}
// 省略...
};
- 29. TickGroup
© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
GameThread
TaskGraphThread
Tick
Async
Finalize
NullTask
このタスクがあると
他のタスク実行を
邪魔する
TickGroup
の終わり
- 31. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
UParticleSystemComponent::UParticleSystemComponent(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
// 省略...
AsyncTickFunction.Target = [this](float DeltaTime) {
ComputeTickComponent_Concurrent();
};
FinalizeTickFunction.Target = [this](float DeltaTime) {
FinalizeTickComponent();
};
// 省略...
}
- 32. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
void UParticleSystemComponent::RegisterComponentTickFunctions(bool bRegister)
{
// 省略...
if (bRegister)
{
if (SetupActorComponentTickFunction(&AsyncTickFunction))
{
AsyncTickFunction.AddPrerequisite(this, PrimaryComponentTick);
}
if (SetupActorComponentTickFunction(&FinalizeTickFunction))
{
FinalizeTickFunction.AddPrerequisite(this, AsyncTickFunction);
}
}
else
{
if (AsyncTickFunction.IsTickFunctionRegistered())
{
AsyncTickFunction.UnRegisterTickFunction();
}
if (FinalizeTickFunction.IsTickFunctionRegistered())
{
FinalizeTickFunction.UnRegisterTickFunction();
}
}
// 省略...
}
- 33. StartFrame TickGroup
© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
GameThread
TaskGraphThread
Tick
Async
Finalize
TickGroup
の終わり
Tick
Async
Finalize
すべての
TickGroup前に
タスクの依存関係の
構築をするようになる
NullTaskがなくなり直接
TickGroupの終わりへ
- 38. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
© 1997, 2020 SQUARE ENIX CO., LTD. All Rights Reserved.
CHARACTER DESIGN:TETSUYA NOMURA/ROBERTO FERRARI
- 39. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
UObjectの数 GCの負荷
© 1997, 2020 SQUARE ENIX CO., LTD. All Rights Reserved.
CHARACTER DESIGN:TETSUYA NOMURA/ROBERTO FERRARI
- 41. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
int32 FEngineLoop::PreInit( const TCHAR* CmdLine )
{
// 省略...
UObject* StartupPackages = LoadPackage(NULL, TEXT("/Game/ResidentAsset"), LOAD_None);
if (GUObjectArray.IsOpenForDisregardForGC())
{
GUObjectArray.CloseDisregardForGC();
}
// 省略...
}
- 42. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
Total:243350
対応前
Total: 140681
対応後
- 43. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
108.76
69.33
83.87
93.83
55.28
67.48
0
20
40
60
80
100
120
A地点 B地点 C地点
ミ
リ
秒
未対応 Disregard for GC
-14.93 ms
-14.05 ms
-16.39 ms
- 44. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
[/Script/Engine.GarbageCollectionSettings]
gc.ActorClusteringEnabled=True
// クラスタを作る
virtual bool UHoge::CanBeClusterRoot() const override { return true; }
// クラスタへ入れないようにする
virtual bool UHoge::CanBeInCluster() const override { return false; }
- 46. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
Total:140681 Total:72345
対応後
対応前
- 47. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
93.83
55.28
67.48
84.07
43.71
58.03
0
10
20
30
40
50
60
70
80
90
100
A地点 B地点 C地点
ミ
リ
秒
Disregard for GC のみ GC Cluster + Disregard for GC
-9.76 ms
-11.57 ms
-9.45 ms
- 49. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
37.62
24.05
12.9
60.48
59.15 59.35
10.66 10.63 10.8
0
10
20
30
40
50
60
70
未対応 Disregard for GC のみ GC Cluster + Disregard for GC
ミ
リ
秒
PerformReachabilityAnalysis UnhashUnreachable その他
- 51. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
class UHoge : public UObject
{
// 省略...
virtual bool IsDestructionThreadSafe() const override { return true; }
// 省略...
};
- 53. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
© 1997, 2020 SQUARE ENIX CO., LTD. All Rights Reserved.
CHARACTER DESIGN:TETSUYA NOMURA/ROBERTO FERRARI
- 54. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
84.07
43.71
58.03
20.52
16.83 18.04
0
10
20
30
40
50
60
70
80
90
A地点 B地点 C地点
ミ
リ
秒
GC Cluster + Disregard for GC すべての改善
-26.88 ms
-63.55 ms
-39.99 ms
- 55. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
12.9
10.82
59.35
0.45
10.8 10.25
0
10
20
30
40
50
60
70
GC Cluster + Disregard for GC すべての改善
ミ
リ
秒
PerformReachabilityAnalysis UnhashUnreachable その他
- 60. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
1 2 3 4
© 1997, 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
CHARACTER DESIGN:TETSUYA NOMURA/ROBERTO FERRARI
- 61. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
適用前 適用後
Frame Rate -2.42 FPS
Game -2.09 ms
Draw -1.53 ms
適用後は大幅な改善!!
© 1997, 2020 SQUARE ENIX CO., LTD. All Rights Reserved.
CHARACTER DESIGN:TETSUYA NOMURA/ROBERTO FERRARI
- 64. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
© 1997, 2020 SQUARE ENIX CO., LTD. All Rights Reserved.
CHARACTER DESIGN:TETSUYA NOMURA/ROBERTO FERRARI
- 65. Frame 2
© 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
Frame 1
GameThread
FEngineLoop
Tick
AsyncLoadingThread
FrameSync
Loading
処理
FEngineLoop
Tick
FrameSync
Loading
処理
- 68. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
Frame 3 Frame 4 Frame 5
Frame 2
Frame 1
GameThread
FEngineLoop
Tick
AsyncLoadingThread
Loading
処理
FEngineLoop
Tick
Loading
処理
FEngineLoop
Tick
Loading
処理
FEngineLoop
Tick
Loading
処理
FEngineLoop
Tick
- 69. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
class UHoge : public UObject
{
// 省略...
virtual bool IsPostLoadThreadSafe() const override { return true; }
// 省略...
};
- 71. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
OFF ON
12.453秒 6.447秒
© 1997, 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
CHARACTER DESIGN:TETSUYA NOMURA/ROBERTO FERRARI
- 73. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
OFF ON
6.447秒 1.926秒
© 1997, 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
CHARACTER DESIGN:TETSUYA NOMURA/ROBERTO FERRARI
- 77. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
Character Movement Component
Skeletal Mesh Component
※ Root Motion と Parallel Evaluate Animation 使用時。Physics / Cloth は除く
- 78. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
Game Thread で実行される Character Movement Component Tick
- 79. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
Character Movement Component Tick で実行される Update Animation
(アニメーション時間更新と Root Motion 移動量計算)
- 80. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
Game Thread で実行される Skeletal Mesh Component Tick
- 81. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
Skeletal Mesh Component Tick からタスクを積まれ、
Task Thread で実行される Evaluate Animation
(アニメーションポーズ評価)
- 82. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
Skeletal Mesh Component Tick からタスクを積まれ、
Evaluate Animation 完了後に実行される
Game Thread で実行される Complate Animation
(Component Transform 更新、Physics Scene 更新、Notify 呼び出し)
- 84. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
Character Movement Component
Skeletal Mesh Component
※ Root Motion と Parallel Evaluate Animation 使用時。Physics / Cloth は除く
- 85. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
Task Thread で実行される Character Movement Component Tick
Update Animation も同タイミングで並列実行
- 86. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
Game Thread で実行される Post Character Movement Update
シーンをクラスタ分割して必要なもの同士のみ押し当たりを実行
- 87. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
Task Thread で実行される Skeletal Mesh Component Tick
※ Tick Manager によるスケジューリング時に投入されるのでオーバーヘッドが少ない
- 88. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
Game Thread で実行される Skeletal Mesh Component Post Tick
※ Tick Manager によるスケジューリング時に投入されるのでオーバーヘッドが少ない
- 89. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
© 1997, 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
CHARACTER DESIGN:TETSUYA NOMURA/ROBERTO FERRARI
- 95. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
次のフレームまでに
まとめて実行
- 96. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
© 1997, 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
CHARACTER DESIGN:TETSUYA NOMURA/ROBERTO FERRARI
- 103. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
モーションA
モーションB
クロスフェード
モーションA モーションB
慣性補間
加算
- 105. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
© 1997, 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
CHARACTER DESIGN:TETSUYA NOMURA/ROBERTO FERRARI
- 108. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
© 1997, 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
CHARACTER DESIGN:TETSUYA NOMURA/ROBERTO FERRARI
- 110. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
直リファレンスは基本的に NG
- 117. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
FName name = TEXT("HogeHoge");
- 118. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
static const FName StaticName = TEXT("HogeHoge");
FName name = StaticName;
- 120. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
UCLASS()
class UMyClass : public UObject
{
GENERATED_BODY()
UPROPERTY()
TArray< FMyStruct > MyDataList;
TMap< int32, FMyStruct > MyDataMap;
virtual void Serialize(FArchive& Ar) override;
};
UCLASS()
class UMyClass : public UObject
{
GENERATED_BODY()
UPROPERTY()
TMap< int32, FMyStruct > MyDataMap;
};
実装イメージ
- 121. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
void UMyClass::Serialize(FArchive& Ar)
{
Super::Serialize(Ar);
// MyDataListはデシリアライズされたTArray
if (MyDataList.Num() > 0)
{
if (MyDataMap.Num() == 0)
{
MyDataMap.Reserve(MyDataList.Num());
for (auto& Elem : MyDataList)
{
// TMapへコピー
MyDataMap.Add(Elem.Id, Elem);
}
}
}
}
- 122. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
実行時間[ms]
対応前(TMap) 468.87
対応後(TArray) 193.84
約60%の改善
- 124. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
実行データ
(UDataTable)
コンバート
・C++クラスの自動生成
・uassetの更新
企画データ(Excel)
- 125. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
コンバート
・C++クラスの自動生成
・uassetの更新
企画データ(Excel) 実行データ
(独自形式)
- 126. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
struct MyDataTableRow
{
int32 HitPoint;
int32 MagicPoint;
bool GameFlag;
TArray<int32> SomeDataList;
void SaveOrLoad(FArchive &Ar);
};
void MyDataTableRow::SaveOrLoad(FArchive &Ar)
{
// 保存と読み出し
Ar << HitPoint;
Ar << MagicPoint;
Ar << GameFlag;
Ar << SomeDataList;
}
- 127. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
UCLASS()
class UMyDataTable : public UObject
{
GENERATED_BODY()
// 行データ
TMap<FName, FMyDataTableRow> RowDataMap;
virtual void Serialize(FArchive& Ar) override;
};
void UMyDataTable::Serialize(FArchive& Ar)
{
Super::Serialize(Ar);
if (Ar.IsSaving())
{
// 保存
int32 RowNums = RowDataMap.Num();
Ar << RowNums;
for (auto& Elem : RowDataMap)
{
FName RowName;
Ar << Elem.Key;
Elem.Value.SaveOrLoad(Ar);
}
}
else
//… 省略
}
- 128. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
データ型 ディスクサイズ[MB]
DataTable 171
独自形式 49.3
約70%の削減
データ型 平均実行時間[ms] 最大実行時間[ms]
DataTable 0.0364 13.305
独自形式 0.0082 4.528
約65%の改善
ファイルサイズの比較
デシリアライズ時間の比較
- 131. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
※「MotionBuilder」は Autodesk, Inc. の商標または登録商標です。
© 1997, 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
CHARACTER DESIGN:TETSUYA NOMURA/ROBERTO FERRARI
- 133. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
Shot 1 Shot 2 ….. Shot XX
Shot 1 Shot 2 ….. Shot XX
オーサリング用
シーケンサー
前半
シーケンサー
後半
シーケンサー
(※補足:ショットとは、カットシーンでカメラが切り替わる間の範囲)
- 134. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
• カットシーンパート
(再生中に後半シーケンサーをロード)
• チャプター開始
• フリー操作パート
• カットシーン前半部のロード
• 終了のトリガーを受け取り、
次のカットシーン前半部の
ロードを開始
• 以降、同様のゲームサイクル
- 138. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
© 1997, 2020 SQUARE ENIX CO., LTD. All Rights Reserved.
CHARACTER DESIGN:TETSUYA NOMURA/ROBERTO FERRARI
- 139. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
© 1997, 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
CHARACTER DESIGN:TETSUYA NOMURA/ROBERTO FERRARI
- 141. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
時間[s]
Frame 1 Frame 3
Frame 2 Frame 4
Frame 1 Frame 3
Frame 2 Frame 4
アクター表示
表示 表示 表示 表示
- 142. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
1フレ表示 分散表示
- 143. © 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
© 1997, 2021 SQUARE ENIX CO., LTD. All Rights Reserved.
CHARACTER DESIGN:TETSUYA NOMURA/ROBERTO FERRARI