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

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

AndroidスマホでDeepProfilerでチューニング中

f:id:yasu9780:20170209233905p:plain

画像は上半分は、スマホで動作のリモートプロファイリング。

下半分は、PCで実行したときのゲーム画面。


PCだとXGA解像度で70FPSぐらいは出ている。
一方、Androidスマホでは13fpsぐらい。解像度を800x600程度のSVGAまで落として、
あと学校の周りの町は無し。窓も非透明化。QualityはFastで、texureはHalfに設定した。
これでもかって落としたけど、fps低いねえ。


町は完全staticでバッチ走るし、無くしてもfpsはそんなに変わってない感じ。
窓の透過をやめたのはどうなんだろう? 透過だからってそんなに遅くはならないと思うんだけど、カリングは効きにくいくなるかも。
iPhone4ぐらいの頃のパフォーマンスのスライドだと、モバイルは透過が苦手だから使うなって話があちこちで多いんだけど、
できれば窓は透過したいんだよねえ。

13fpsぐらいだけど、遊べないってことはないかなと思う。できればせめて20fpsは欲しい。
何をすればいいんだろう?

  • テクスチャを小さくする
  • マテリアルを少なくする
  • 小さな小物は無くす(チョークとか黒板消しとか無くす)

人物キャラもMじゃなくてLモデルも検討してもいいかもしれない。
ただ、SkinnedMeshがどのくらいパフォーマンスに影響が出ているのはまだよくわかってない。
DeepProfilerを勉強しなけば。
(ある時点で、調べるとGPUの0.5%しか占めてない。実は負荷が低いのかも)


tsubakiさんの以下の記事なんかみて、
tsubakit1.hateblo.jp
コルーチンで、yeild return new waitforSeconse(3f)みたいにnewしてるとGC動くってのは気づかなかった。
全体的には、GetComponentしてるところがGCバリバリで速度低下してたけど、できればGCは起きないにこしたことはない。
ループの外で宣言してキャッシュしておけば解決する。
ただ、CPUにくらべてGPUが圧倒的に遅いので、スクリプトをちまちま改善しても的外れ。

ただし、上記のプロファイラはプロファイラ自体が20%とか遅延を起こしているのも注意しないといけない。




みなさんこんにちは。Unityで作成したゲームの、Android端末での動作... - Yahoo!知恵袋

device.presentに関してですが、
これはプログラムの各関数の呼び出しを少しずつ減らすだけでも、
劇的な効果が得られます。

まじ?
GPUの74%がDevice.Prensentなんですけど。もしかしてスクリプトが悪い?

この謎のGraphics.PrensentAndSyncの74%が諸悪の根源なのは間違いない。
しかも、DrawCalls たったの1回(´・ω・`)


CPUの中では、Physics.Raycastが15%で圧倒的に負荷が多い(ただし352callsで呼び出し自体が多い)
やはりPCとAndroidじゃ、遅いところの傾向が違いますね。