LoginSignup
0
0

More than 1 year has passed since last update.

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

Posted at

概要

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

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

まとめ

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

0
0
0

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
  3. You can use dark theme
What you can do with signing up
0
0