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

AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

DeepProfilerで速度チューニング

学校シミュレーターもだいたいできてきたので、公開のために速度チューニング中です。
DeepProfilerでスクリプトの速度チューニングをやっています。

まずやったのは1fps毎にやる必要のない処理を0.3秒毎とか、実行回数自体を減らすことですね。
初期状態では、近くのキャラを調べて近かったらLookAtで見るとか、
近くのキャラに話かけるみたいな処理がスクリプト実行時間の70%ぐらいしめてました。・゚・(ノ∀`)・゚・。 
30キャラでfor回して、距離や内積を求めて、さらにRaycastで可視性も調べてるので何気に重い。
これを0.3秒ごとに実行にするだけで、スクリプトの実行時間は大幅に向上w

0.02秒毎に、近くの人がいないか調べてる人間はいません。

それでもまだ一番近いキャラを調べる関数が実行時間の多くを占めていたので、結果をキャッシュして、呼び出し回数を減らしました。
個別にこの関数の処理時間を見てみると、実は内積を求める関数が遅かった。
やっぱり浮動小数点dotは遅いのか?
と思いきや、実は遅いのは、Transform.forwardを参照する処理が遅かった。
これをキャッシュすると問題解消。

Unityのイベントで、Transform.positionは遅いので、LocalPositionを使うべしって解説があったらしいですが、
プログラムによって呼び出し回数が違うので、可読性も考えたうえでやればいいですね。

あと、camera.mainの参照が遅かった。Findしてないし、楽だから使ってなかったけど、内部でFindしてるのかな?
これもキャッシュした。


f:id:yasu9780:20170208225256p:plain

現時点で、Transform.set_rotation()って内部関数が一番負荷なので、これはキャッシュするか、呼び出し回数を減らすかのどっちかで対処することができる。

吹き出し表示移動も遅かったんで、0.3秒ごとに描画にしたら、動きががたがたになったので、
基本1fpsで処理して、Raycastの可視性チェックだけ0.3秒ごとなどに変更。
現状、BaloonUpdateFast()は1fpsで呼び出して全体の3.2%なんで、問題ないかな。

あと、animationのステートを見るのを遅いので注意なんて記事をいろんなところで見ましたが、全然遅くないですね。
AnimationStateInfo.IsName()が145回読んで、たったの0.3%ですから、気にせず使っていいと思う。
ただパソコンでのprofileなんで、モバイルではまた結果が変わってくるかもしれないけど。

現状、一番食っているWaitForTargetFPSはよくわからないけど、VSyncなんで、表示待ち? 結局はRenderingの問題なのかな?
これはVsyncきれば減るらしいけど、それだと動きががたがたになるらしいので、やりません。



ということで、リモートでモバイルのProfileもやってみます。
もちろんRenderingの速度評価もやらないといけません。
気になるのは、そもそもヤンデレちゃんMモデルは何体ぐらいスマホで表示できるのか? Hモデルならどうなのか?
SkinnedMeshなんで、バッチなんか効かないはずなんですよね。

広告を非表示にする