LoginSignup
0

More than 1 year has passed since last update.

posted at

UE4 RenderTargetでのメモリリークについてのメモ

概要

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
    });
}

これでレンダーターゲットが解放されるようになりました。

まとめ

メモリリークはなかなか追跡が大変です。ツールを使うにも学習コストが。。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0