概要
UnrealEngine にてRenderTargetのメモリリークについての調査と解決方法についてのメモです。
環境
Windows10
Visual Studio 2017
UnrealEngine 4.26
参考
以下を参考にさせて頂きました、ありがとうございます。
VRAMリークの調査方法について
[UE4] メモリーリークをどう追跡して修正するか
[UE4] C++コードにゲームの初期化,終了,更新のタイミングで処理を追加する方法
RenderTargetメモリリークについて
r.DumpRenderTargetPoolMemory
にて調査中に以下の値が徐々に増えていることに気づきました。
出力結果
[2021.12.19-06.20.03:758][573]Pooled Render Targets:
[2021.12.19-06.20.03:766][573]53.282MB total, 12.095MB used, 28 render targets
使用終わりのレンダーターゲットが解放されていないということになります。
関連コード
"Engine\Source\Runtime\RenderCore\Private\RenderTargetPool.cpp"
対処コード
ゲーム開始時にレンダースレッドに ENQUEUE_RENDER_COMMAND
マクロを使って未使用レンダーターゲットを解放するタスクを積みます。
以下参考コード。
MyProject.cpp
#include "RenderTargetPool.h"
void FMyAppMainModule::StartupModule()
{
// レンダースレッドにタスクを積む
FWorldDelegates::OnPostWorldCreation.AddLambda([](UWorld* pWorld)
{
#if !WITH_EDITOR
ENQUEUE_RENDER_COMMAND(MyProjectWorldChanged)(
[](FRHICommandListImmediate& RHICmdList)
{
// 未使用リソースを解放
GRenderTargetPool.FreeUnusedResources();
});
#endif
});
}
これでレンダーターゲットが解放されるようになりました。
まとめ
メモリリークはなかなか追跡が大変です。ツールを使うにも学習コストが。。