ブループリントを実行するのにかかる時間を調べる
妹「イベントティックで、配列の中身をループさせてチェックするとかやっていいのかな?」
「やってもいいと思うけど、なんで?」
妹「茂みとかもそうだけど、アクションが起こせるアクターの近くに行った時に、それとわかるような演出を出したいんだよ。で、そういう時にアクターの一覧を調べてゴニョゴニョしたいなあと」
「それぐらいなら多分大丈夫だろうと思うけど、断言は出来ないかな。ループの中で何をやるのかにもよるし。気になるなら調べてみればいい。やり方は……ひょっとしたらUE4的にハイテクで良い感じの方法があるのかもしれないけど、とりあえずはよくある方法で」
「Nowノードというのは、そのノードを呼び出した時点での時間、何年何月何日何時何分何ミリ秒というのを取得するノード」
妹「秒じゃなくてミリ秒なの?」
「1秒じゃなくて1000分の1秒単位で調べられる。秒が必要な時はそれようのノードを使うなり、ミリ秒を1000で割るなりする。これを使って、処理の前と後の時間を測って、その差を調べる。
例えば会議が12時に始まって、終わった時間が13時だとすると、13-12でその会議には1時間かかったというのがわかる。これをブループリントとミリ秒単位に置き換えて考える。今回はSetSpriteノードと、そこに連動してる選択する(Select)ノードとかの処理時間を調べてみる」
「結果がこれ。毎回0ミリ秒かかっているということがわかる」
妹「……バグってるんじゃないの? 0だったら何回やっても同じってことじゃないの?」
「0というか、1ミリ秒以下の時間で終わったってことなんだよ。そのへんのウィンドウをマウスでぐりぐり移動させてみたり、パソコンに負荷をかけると、0が1になったりするから、バグというわけじゃない」
妹「じゃあ凄く速いのか」
「速いんだけど、速くないと困るんだよ。1ミリ秒というのは1000分の1秒のことで、1秒間に60フレームの処理を前提にすると、1フレーム16ミリ秒居ないで済ます必要がある。そしてグラフィック処理の時間がほとんどを占める。だからブループリントの処理はほとんど0ミリ秒で済ませたい。といってもこれじゃよくわからないから、試しに同じことを10000回やって時間を測ってみる」
妹「17と18?」
「毎回多少ばらつきはでるから、だいたいの数字で見る。さっきもちょっと話したけど、その時パソコンで何やってるかというのも影響してくるし。もちろんそのパソコンの性能も。兄のパソコンだとこれぐらい、つまり1回分の速度は約0.0000017秒だというのがわかる」
妹「1回だと全然平気だけど、1万回もやらない方がいい?」
「17だともう1フレーム分の処理時間ほとんど使い切っちゃうからね。もっと遅いパソコンも想定するとさらに厳しい。1000ぐらいなら大丈夫だろうけど他のブループリント次第。そんな感じで気になるところを調べていけばいい。どうしても時間がかかる処理は計算するタイミングを変えたり、大量のループさせないで済む方法を考えてみるのも大事。部分的にC++で書くという方法もある」