読者です 読者をやめる 読者になる 読者になる

妹でもわかるUnrealEngine4

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

ブループリントを実行するのにかかる時間を調べる

妹「イベントティックで、配列の中身をループさせてチェックするとかやっていいのかな?」

「やってもいいと思うけど、なんで?」

妹「茂みとかもそうだけど、アクションが起こせるアクターの近くに行った時に、それとわかるような演出を出したいんだよ。で、そういう時にアクターの一覧を調べてゴニョゴニョしたいなあと」

「それぐらいなら多分大丈夫だろうと思うけど、断言は出来ないかな。ループの中で何をやるのかにもよるし。気になるなら調べてみればいい。やり方は……ひょっとしたらUE4的にハイテクで良い感じの方法があるのかもしれないけど、とりあえずはよくある方法で」

f:id:una_unagi:20151215221939p:plain

「Nowノードというのは、そのノードを呼び出した時点での時間、何年何月何日何時何分何ミリ秒というのを取得するノード」

妹「秒じゃなくてミリ秒なの?」

「1秒じゃなくて1000分の1秒単位で調べられる。秒が必要な時はそれようのノードを使うなり、ミリ秒を1000で割るなりする。これを使って、処理の前と後の時間を測って、その差を調べる。
例えば会議が12時に始まって、終わった時間が13時だとすると、13-12でその会議には1時間かかったというのがわかる。これをブループリントとミリ秒単位に置き換えて考える。今回はSetSpriteノードと、そこに連動してる選択する(Select)ノードとかの処理時間を調べてみる」

f:id:una_unagi:20151215222530p:plain

「結果がこれ。毎回0ミリ秒かかっているということがわかる」

妹「……バグってるんじゃないの? 0だったら何回やっても同じってことじゃないの?」

「0というか、1ミリ秒以下の時間で終わったってことなんだよ。そのへんのウィンドウをマウスでぐりぐり移動させてみたり、パソコンに負荷をかけると、0が1になったりするから、バグというわけじゃない」

妹「じゃあ凄く速いのか」

「速いんだけど、速くないと困るんだよ。1ミリ秒というのは1000分の1秒のことで、1秒間に60フレームの処理を前提にすると、1フレーム16ミリ秒居ないで済ます必要がある。そしてグラフィック処理の時間がほとんどを占める。だからブループリントの処理はほとんど0ミリ秒で済ませたい。といってもこれじゃよくわからないから、試しに同じことを10000回やって時間を測ってみる」

f:id:una_unagi:20151215223458p:plain
f:id:una_unagi:20151215223505p:plain

妹「17と18?」

「毎回多少ばらつきはでるから、だいたいの数字で見る。さっきもちょっと話したけど、その時パソコンで何やってるかというのも影響してくるし。もちろんそのパソコンの性能も。兄のパソコンだとこれぐらい、つまり1回分の速度は約0.0000017秒だというのがわかる」

妹「1回だと全然平気だけど、1万回もやらない方がいい?」

「17だともう1フレーム分の処理時間ほとんど使い切っちゃうからね。もっと遅いパソコンも想定するとさらに厳しい。1000ぐらいなら大丈夫だろうけど他のブループリント次第。そんな感じで気になるところを調べていけばいい。どうしても時間がかかる処理は計算するタイミングを変えたり、大量のループさせないで済む方法を考えてみるのも大事。部分的にC++で書くという方法もある」