【UE4】ポーズ中に描画の更新のみを止める

UE4 のデフォルトのポーズ機能を使うと描画と内部処理の更新が止まります。

ですが、コンテンツによっては「画面は止めたいんだけど内部処理はそのまま走らせたい」という場合があると思います。

今回はその方法を2つ紹介したいと思います。
どちらの方法でも UMG は通常通り動きます。


bDisableWorldRendering

1つ目の方法です。
UGameViewportClient クラスにある bDisableWorldRendering 変数を有効にする方法です。

この変数を有効にした場合、ENQUEUE_UNIQUE_RENDER_COMMAND マクロが呼ばれて描画の更新が止まります。

ただ、こちらの方法だと画面が真っ暗になってしまうので、例えば背景として止まった画面を残しておきたい場合などは変数を有効にする前にスクリーンをキャプチャし、レンダーターゲットに貼り付けて UMG で表示などする必要があります。


EngineShowFlags.Rendering

2つ目の方法は、1つ目と同じく UGameViewportClient クラスにある EngineShowFlags.Rendering という変数です。

こちらは各 Render 関数で使われていて描画の更新を止めることができます。

具体的には DefferredShadingRenderer > Render で使われています。
※ Defferredとついていますが Forward Rendering でも DefferredShadingRenderer の Render 関数を使って描画処理が行われているため Forward Rendering でも止まります。

こちらは画面が真っ暗になることはなく、画面が止まるだけです。

youtu.be

マネキンが左右に往復を繰り返しているシーンですが、ポーズした際に描画の更新が止まり、ポーズ解除するとマネキンの位置が更新されているのがわかると思います。
また、ポーズ中でも UMG は更新されています。

コンソールコマンド「show Rendering」でトグルするか、
「UGameViewportClient > EngineShowFlags > SetRendering();」 で値を設定できます。


処理負荷

気になる処理負荷についてですが、bDisableWorldRenderingEngineShowFlags.Renderingどちらを使った場合でも処理負荷は軽いです。

エディターでの検証ですが、各機能と比較した動画です。
先程のシーンにパーティクルをたくさん配置して検証しています。

www.youtube.com