BPの共通処理:マクロと関数の違いと速度比較

共通処理を書く方法はマクロと関数の2種類ある。
どちらも新しいノードとして利用できる。
毎回ノードを組むより楽になるし、処理の中身を調整するのも1回で済む。1つのノードにまとめることができるのでグラフが読みやすくなる。
速度計測してみると、どちらも直接ノードを書くよりはコンパイルは短くなったが、実行速度は若干遅くなった。

マクロライブラリ

マクロはノードを折りたたんで1つにまとめるもの。
折りたたみ機能との違いは再利用可能なこと。折りたたみ機能ではノードをコピーすると同じ内容の新たな折りたたみノードが作られるため、内容を一括して変更することができない。マクロや関数では内容を編集すればすべての利用箇所に反映される。
ContentBrowser -> RightClick -> Blueprints > Blueprint Macro Library
作成時に基底BPクラスを選択する。
基底BPクラスに関係があるBPクラスからのみ利用可能 CharacterのマクロはActorからは呼べない。
既存のグラフのノードの一部を選択し -> 右クリック -> マクロに折りたたむ  でも作成できる。
マクロ単体のコンパイルは不要。利用箇所で内部的に展開されてコンパイルされる。
マクロの内容を編集した場合は利用しているものは再コンパイルが必要になる。Play時などに自動でコンパイルされるので自分でコンパイルしなくても大丈夫。
マクロの内容を編集した場合でも利用箇所での再コンパイルは不要。

関数ライブラリ

関数は個別にコンパイルされ、利用箇所では呼び出す処理だけになるのでBPのコンパイルを短くできる。大規模プロジェクトで再利用箇所が増えると効果大。
ContentBrowser -> RightClick -> Blueprints -> Blueprint Function Library
既存のグラフのノードの一部を選択し -> 右クリック -> 関数に折りたたむ  でも作成できる。
関数の制限があり、スポーンなど一部ノードが中に書けない。delayなど処理待ちが起きるノードも書けない。(マクロでは書ける)
ローカル変数が使える。
詳細 > カテゴリ に入力した文字列でノードリストに項目が作られる。ノードリストの検索ではカテゴリ名でも検索可能。
詳細 > キーワード は表示されないがノードリストで検索可能。日本語名称の英語検索などにつかえそう。
関数の内容を編集した場合は関数のみコンパイルするだけでいい。利用箇所の再コンパイルは不要。

簡易的な速度比較

2D Grid Execution Macro(29ノード)と同等の処理を、折りたたみ・マクロ・関数、の3パタンで用意して比較してみた。

BPで15回呼び出す場合のコンパイル時間は
折りたたみ版:510ms
マクロ版:260ms
関数版:200ms


150回呼び出す処理の実行時間は
折りたたみ版:3ms
マクロ版:50ms
関数版:16ms


となり、
折りたたみは、コンパイルがとても遅く、実行がとても速い。
マクロは、コンパイルはそこそこ速く、実行は遅い。
関数は、コンパイルは速く、実行もほどほど速い。


マクロと折りたたみでコンパイル時間や実行時間にかなり差が出たのは意外だった。
他言語でのマクロとは仕組みが違うのかも。