ねじ式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

UE4 Issuesを活用してエンジンバグに対応しよう

4.23辺りのバージョンからプロファイラツールの挙動がおかしくなり、原因を調べているとどうもエンジンのバグのようでした。
UE4 Issuesで調べてみると4.25で修正されている模様…
しかしいつ来るかわからないバージョンアップは待っていられないしリリースされたとしてもプロジェクトで使っているエンジンのバージョンアップは手間やリスクが伴うため頻繁にアップデートはできません。
それなら必要なバグ修正だけとりいれてビルドしてしまおう!というのが今回のお題です。
(ちなみに4.25はつい先日リリースされました。)

UE4 Issuesとは?

https://issues.unrealengine.com/
UE4のバグが確認できる公式のサイトです。
修正されていればどのバージョンで修正されているかも分かります。

 

UE4 Issuesからソースコードを取得する

今回はこのバグなのでこちらを元に説明していきます。
https://issues.unrealengine.com/issue/UE-80571

f:id:neji42ch:20200509002520p:plain

Fix Commitの欄の数字をクリックするとソースコードを取得できます。
ヤー!

f:id:neji42ch:20200509002826p:plain


…あれ?
しかし慌ててはいけません。

UE4 Issuesを活用するにはまずGitHubのアカウントが必要です。
持ってないのであれば右上のSignupからアカウントを作成しSigninしましょう。
GitHubのアカウントが用意できたら次はEpicのアカウントと連携します。
Epicのページからログインし、接続から用意したGitHubアカウントでGITHUBへ接続します。

f:id:neji42ch:20200509005948p:plain


接続が完了するとEpicから完了メールが届きます。
接続完了したら再度UE4 IssuesからGitHubへ飛んでみましょう。
下記画像のようにソースコードが表示されればOKです。

f:id:neji42ch:20200509010626p:plain


ソースコードをビルドしよう

ついにバグ修正のソースコードを手に入れたのでこれを使ってビルドしましょう。
今回は1ファイルかつ4行しか修正箇所がないのでそのままコピーします。

f:id:neji42ch:20200509010936p:plain

 

ファイル名や修正箇所の行数、前後のコードを確認してペーストします。

f:id:neji42ch:20200509013412p:plain

この辺りのようです。
あとはビルドを行って修正が反映されているか確認しましょう。

最後に

バグっぽいものを見つけて調べたりアンサーハブで質問したりすると既知のバグの場合はだいたいUE4 IssuesのURLが貼られたります。
修正がリリース前のバージョンだったり、バージョンアップができない環境であれば是非活用していきましょう!

 

パッケージ化した際に独自のコンフィギュレーションファイルが読めなくて困った話

みなさんコンフィギュレーションファイルは活用してますか?
今回はタイトル通り、パッケージ化した際に独自のコンフィギュレーションファイルが読めなくて困った話です。
コンフィギュレーションファイルとはなんぞやという方はこちら↓
コンフィギュレーション ファイル | Unreal Engine ドキュメント
簡単に言うと、パッケージ化した後でも変数の値がいじれる外部iniファイルです。(以下iniファイル)

私はDefaultGame.iniに直接は書かず、独自のiniファイル(仮にMyConfig.ini)をDefaultGame.iniと同じディレクトリに入れて-GAMEINIコマンドで読み込んで運用していました。

が、突如読み込まなくなる。

…心当たりはありました。
今までパッケージ化にあたって、UsePakFileのオプションを使っていなかったのですが、Pakファイルに圧縮を行ってから読み込めなくなりました。
Pakファイルに圧縮を行う前は\WindowsNoEditor\プロジェクト名\Config内にDefaultGame.iniやMyConfig.iniがあったのに、Configフォルダごと生成されていません。
おそらくPakファイルの中にまとめて圧縮されているのでしょう。
しかし、-GAMEINIコマンドでパスを指定できるのですからMyConfig.iniを後から作って読み込めばいい話です。

が、まだ読み込めない。

原因
どうも-GAMEINIコマンドで指定した名前と同名のiniファイルがPakファイル内にある場合、そちらを読み込んでしまうようです。(パス指定とは…?)

解決策

  • パッケージ化する前にConfigフォルダからMyConfig.iniを削除しておく
  •  Pakファイル内に圧縮されていない名前のiniファイルを指定して読み込む

 

以上、独自のiniファイルを作るときは気をつけようの話でした。
UE4.22