ゲーム開発備忘録

ゲームプログラマー UE4・5向けの記事を書いておりますので見ていただけるとありがたいです。

【UE4・UE5】〈Tips〉検証 - BP の Switch と Select ノードはどちらが軽いか??

目次

 

はじめに

ブループリントを組むときに用いるSelectやSwitchノード。やってることは同じな場合どちらのほうがパフォーマンスが出るのでしょうか?

 

C++にすればいいじゃんというツッコミはさておき、ブループリント使いの方の参考になれば幸いです。

 

▼ 本日の主役

 

Unreal Insightsやモバイル端末の実機で負荷の検証をします。

 

個人の備忘録としてまとめています。あくまで手元の環境で計測した結果なので、デバイスの性能やプロジェクトによって変化することもあると思います。
あくまで参考程度に呼んでいただけると嬉しいです!

 

UE5.4.3で解説します。

 

環境

 

デスクトップPC

Windows 10 Pro

環境プロセッサ    AMD Ryzen 9 5900X 12-Core Processor  3.70 GHz
実装 RAM    96.0 GB
GPU RTX 3080 58.0GB

 

 

オンボロAndroid端末

Android 10

SoCQualcomm : Snapdragon 730

RAM : 6GB ベンチマークAntutu7 : 213113,

Geekbench4 シングル:2569 マルチ: 7096

 

解説

事前準備

実行時に別の処理が走ることを避けるため真っ暗なレベル、GameMode/PlayerController/Pawnは新規作成したものを用意しました。



検証内容はシンプルに列挙型をランダムに選択しPrintStringの色を変えて10,000回出力するというものにしました。

 

共通ロジック

 

入力に応じて交互に走るように設定しました。

Switch

こちらはスイッチノードを利用して実行ピンとしてPrintStringのノードを選択する形式です。

Select

対してこちらは列挙型のパラメータに応じた型を設定していく形です。
見やすさ的にはこっちのほうがシンプルですね。

検証① - エディタからUnrealInsightsで比較

実行してUnrealInsightでプロファイリングします。

 

ちょうど入力したときに大きくフレームレートが低下しているのが確認できます。

 

実際に処理が終わるまでに何ミリ秒かかったかが確認できます。
時間が短いほど処理が軽量で、長いほど処理が重いです。


5回計測した結果はこちらです。

Switch - 47ms / 48.1ms / 46.1ms / 49.2ms / 47ms

->平均: 47.48ms

 

Select - 39.1ms / 38.6ms / 38.5ms / 42.4ms / 42.5ms 

->平均: 40.22ms

 

Selectの勝利!!

検証② - デベロップメントビルドで古いAndroid端末で確認

 

10,000回だとクラッシュしそうなので5,000回に減らしました。

 

Stat UnitGraphでフレームレートの負荷を見ます。

以下実機スクショ

 

Switch->Select->Switch->Selectの順番で実行しています。

ほんの少しではありますがSwitchでは警告ラインを上回っているのが確認できました。

(たぶん)Selectの勝利!!

 

特定の場合のみ別の処理をフロー制御する場合を除いてSelectのほうがほんのりパフォーマンスがいいことが分かりました。

 

検証③ 処理が重い場合

検証①ではTextColorという定数を指定しただけですが、この処理がそれぞれ重い場合はどうでしょうか?

GenerateRandomColorAndAverageColorという激重関数を作りました。

ここでは100個カラーをランダムに生成しその平均色を出力するピュア関数です。

 

こちらをSwitchとSelectそれぞれの入力に接続しました。

Switch

 

Select

 

 

エディタで計測しました。
Windowsでも非常に重いので100ループで検証します。

 

見るからに差があるのが分かります。

5回計測した結果はこちらです。

Switch - 106.2ms / 104.5ms / 105.9ms / 105.1/ 106.2ms

->平均: 105.58ms

 

 

Select - 637.5ms / 612.4 / 620.1ms / 621.2ms / 621.6ms 

->平均: 622.56ms

 

Switchの勝利!!

 

なんと先ほどの検証と真逆でSwitchのほうが圧倒的にパフォーマンスが良いことになりました。

差は6倍ほどあります。

これはSelectのノードがすべての評価を行っているからです。

Selectノードを利用する場合はすべてのピンに接続されている関数などが実行されても問題ないかを確認して利用必要があります。

 

 

最後までお読みいただきありがとうございました。

 

最後に

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやX(Twitter)のフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

投げ銭を投げる