概要
この記事では、Unreal Engine 5 の WidgetBlueprint(WBP)において、下記のCPU処理負荷の比較を行います。
(※厳格な比較ではなく、大まかな比較ではあるため、参考例の1つ程度に捉えていただけると幸いです。)
1. WBP の WidgetTree 内において、テキストブロックを配置する階層の深さを変えた場合の、描画処理負荷(CPU)の比較
2. 1つの WBP を複数の WBP に分割するとき、分割する WBP の数を変えた場合の、描画処理負荷(CPU)の比較
3. 1つのWBPを複数の WBP に分割するとき、分割する WBP の数を変えた場合の、関数呼び出し負荷の比較(関数呼び出し回数が分割数分だけ増える)
この記事の主な対象者
- WidgetBlueprint(WBP)を作成される機会が多い方
- WBP の階層数や分割数の違いによる、処理負荷の違いに興味がある方
目次
- 検証環境
- 検証1. 配置階層の違いによる描画処理負荷の違い
- 検証2. WBP の分割数の違いによる描画負荷の違い
- 検証3. WBP の分割数の違いによる関数呼び出し負荷の違い
- 各検証の結果を受けた筆者の見解
検証環境
- UE 5.5.4
- エディタ環境(Launcherからの直起動)
- 検証に使用する WBP 以外は、ゲームプレイ画面に描画していない状態
- 下図のタブ以外のエディタのタブは閉じた状態
- 新規レベルの「Basic(基本)」上で対象の WBP を表示し、 Unreal Insight で計測
検証1. 配置階層の違いによる描画処理負荷の違い
使用したWBP
下図のように、一番上の階層に「Scale Box」「Size Box」を使用しているとともに、一番下の階層に「Text Block」を10個配置しました。
負荷として見た場所
「Unreal Insight」における、下記の項目
[検証に使用した WBP 名]_C /Engine/Transient.UnrealEdEngine_0:GameInstance_[GameInstance の Instance Index].[検証に使用した WBP 名]_C_0_Paint
結果
| 階層数 | 描画負荷 [μs] |
|---|---|
| 1 | 39 |
| 5 | 45 |
| 10 | 50 |
| 15 | 62 |
| 30 | 82 |
(※描画負荷に関しては、100フレームの負荷の平均値を、1フレーム当たりの負荷として記載)
検証2. WBP の分割数の違いによる描画負荷の違い
使用したWBP
分割していない WBP は、一番上の階層に「Scale Box」「Size Box」を使用しているとともに、一番下の「CanvasPanel」の階層に「Text Block」を10個配置しました。
分割する WBP は、分割していない WBP の「CanvasPanel」の部分を1つの WBP として分けて作成し、下図の参照関係のような入れ子構造にしました。
(※検証で作成した各分割数の WBP において、階層数は同じ(最大分割数と同じ、15個の「CanvasPanel」下に「Text Block」がある状態)にしています。)
負荷として見た場所
「Unreal Insight」における、下記の項目
[検証に使用した WBP 名]_C /Engine/Transient.UnrealEdEngine_0:GameInstance_[GameInstance の Instance Index].[検証に使用した WBP 名]_C_0_Paint
結果
| 分割数 | 描画負荷 [μs] |
|---|---|
| 1 | 62 |
| 5 | 69 |
| 10 | 81 |
| 15 | 86 |
(※描画負荷に関しては、100フレームの負荷の平均値を、1フレーム当たりの負荷として記載)
検証3. WBP の分割数の違いによる関数呼び出し負荷の違い
※この検証で見る関数呼び出しによる処理負荷の違いは、「自身とは異なる別の WBP の関数呼び出しによる処理負荷の差」ではなく、「WBP を分割することで発生してしまう関数呼び出しによる処理負荷の差」です。
そのため、分割数に応じて、関数呼び出しをする回数が増えるようにしました。
使用したWBP
分割していない WBP は、一番上の階層に「Scale Box」「Size Box」を使用しているとともに、一番下の「CanvasPanel」の階層に「Text Block」を1個配置しました。
分割する WBP は、分割していない WBP の「CanvasPanel」の部分を1つの WBP として分けて作成し、下図の参照関係のような入れ子構造にしました。
また、一番上の階層の WBP から、一番下の階層の WBP に対して、毎フレーム1回だけ関数呼び出しを行うようにしました。末端以外の WBP からは、その WBP が保持しているつなぎの WBP の関数を呼び出すようにし、末端の WBP にて、「Text Block」の「Set Text」を呼び出すようにしました。
負荷として見た場所
「Unreal Insight」における、下記の項目
ExecuteUbergraph_[検証に使用した WBP 名]
(※検証で使用した WBP のグラフには、検証で必要とした処理以外は記載しないとともに、検証で必要としていないノードは有効化しませんでした。)
結果
| 分割数 | 関数呼び出し負荷 [μs] |
|---|---|
| 1 | 25 |
| 5 | 34 |
| 10 | 44 |
| 15 | 59 |
(※関数呼び出し負荷に関しては、100フレームの負荷の平均値を、1フレーム当たりの負荷として記載)
各検証の結果を受けた筆者の見解
「WBP 内に配置するウィジェットの階層の深さの違い」「WBP の分割数の違い」によって、両方とも確かなCPU処理負荷の差が生まれていました。そのため、実際のゲームの開発の中でも影響を受ける場面が多くありそうな 「WBP 内に配置するウィジェットの階層の深さの違い」による影響は、特に注意する必要そうだなという印象を受けました。
また、「対象の WBP 内の Widget の数が多いか」「対象の WBP は常に描画されているのか」「対象の WBP が同時にどれくらいの数描画されることがあるか」など、様々な条件次第で処理負荷対策としての優先度は変化しますが、 WBP を作成し始める時点で「WBP 内に配置するウィジェットの階層の深さ」「WBP の分割数」は、処理負荷が上がる要素の1つとして考慮しておく必要があると筆者は考えます。
以上で検証は終了となります。
最後まで読んでいただき、ありがとうございました。










