ねじ式UE4備忘録

個人的にハマったこととか、為になったことをアウトプットする為のブログです。

Pure関数のコール数に気をつけよう

実行ノードを繋げなくてもよく、見た目もスッキリするPure関数ですが気がついたら気がついたら負荷がかかる原因になっていた…という事も。
今回はPure関数使用時の注意点をまとめました。

Pure関数とは?

関数を作成した際に、詳細の「純粋」にチェックを入れた関数の事です。
逆にチェックを入れていない場合はNonPure関数と呼ばれます。

f:id:neji42ch:20210916194712p:plain

 

Pure関数には実行ノードがなく、アウトプットノードを繋げば関数を実行されますが、NonPure関数は実行ノードを繋がないと関数が実行されません。

f:id:neji42ch:20210916201437p:plain

Pure関数とNonPure関数

Pure関数が実行されるタイミング

例えば下記の画像の場合だと関数自体は一つですが、アウトプットノードを繋いでいるSetが呼ばれる度に関数が実行されています。

f:id:neji42ch:20210916203608p:plain

コール数は3回

結構落とし穴なのがSelectノードを使用した場合です。
パッと見はTrueの時にCalcFunctionを実行しようとしていますが、この場合TrueでもFalseでもSelectノードに繋いだPure関数は実行されています。
ループ内で呼ばれていたりなんかしたら、ループ回数分実行されます。

f:id:neji42ch:20210916203913p:plain

実行されてなさそうで実行している

コール回数を抑える方法

NonPure関数を使う

NonPure関数で下記のように繋いだ場合、関数は一度しか実行されません。

f:id:neji42ch:20210916204448p:plain

コール回数は1回

一度キャッシュしておく

ローカル変数等に一時的に保存しておいて使い回す。

f:id:neji42ch:20210917113828p:plain

コール回数は1回

まとめ

Pure関数を何も考えずに繋ぎまくっていると意図していないコール数になっている事がある。
複雑な関数であれば処理負荷にも繋がってしまう為、状況に応じて処理の最適化の必要があります。
コール数の確認はプロファイラツールが便利なので活用していきましょう。

docs.unrealengine.com