キーのOFFイベントがタイミングにより稀にこないことを発見。
ちょっと挙動観察と再実装思案で時間を食った(この手の挙動は処理系によっては良くある
ダイアル、キー入力等がおおむね実装完了(当のバイオリズム描画はまだw)。
とりあえず調整後は、現在こんな感じ。動画にしてみた。
パフォーマンステスト
で、本題。
調整前は実機(Kindle Fire HD 8.9)で動作させると定常状態で fpsが14に!?
ダイアルのみの時は60fpsでていたので劇的に落ちている。
ということで原因調査とfpsを改善する方法を検討。
■ライト
現在シーンにライトは1つしかないが、ライトに関する影響がかなり大きい。
※コードの実行負荷はライト負荷に比べると現状誤差レベルぽい。 結構クラス化してガンガン動かしてるがおもったよりコードの負荷は軽そうなのが意外。
【対象オブジェクトの面積が増えた】
ライト設定はPointライト。
ダイアルのみの場合に対して、現在は本体ケース全体にもライトが当たる。どうやらこれがfpsに影響している。つまり光源処理が重い。
全オブジェクトの Cast Shadows, Receive Shadowsをオフすると1~2fps程度軽減されるがあまり効果はない。
とはいえ、オブジェクト面積は減らしようもない。
※Unityの場合光源は何か当てないと真っ黒になってしまう様子。完全にオフにはできないのかも?
【ライトの種類】
Unityの公式マニュアルにも明記があった。Point、Spotライトが高負荷らしい。最も軽いのはDirectionalライト。
実機実測で以下の通り。
Spotライト: 14fps(コレだった
Pointライト:18fps
Directionalライト:42~45fps
と、いうことでDirectionalライトに変更。
ダイアルだけのときはSpotライトで60fpsでていたので、増えたオブジェクトの光源処理で劇的に落ちたと思われる。
【Light Probes(ライトプローブ)】
Pro版のみ対応なので試せない(´Д⊂。しかしこれはかなり強力そう。
Unity上の光源シーンからテクスチャにベイクするとのこと。
環境光的な光源は10や20個置いてもこれでベイクしてテクスチャにしてしまうという機能。
【カリング】
私的にはクリッピング(?)とつい思ってしまうが、見えない部分のレンダリングをしない設定。
これもPro版のみなので試せない。
※しかし今回の当方のモデリング状況では効果は薄そう。
■DrawCall
説明はネットのあちこちにあるので割愛。
Statでみたところ現在DrawCall数48。スマホ用途も考慮すると40程度に抑えるくらいが良いらしい。
見た目のモデルのわりに48はちょっと多すぎか?
■総頂点数確認
Blender上でモデリングの総頂点数を確認 ->19824頂点。なんか多いw。
原因は数字ダイアル。
そもそもただのシリンダなので1つで20頂点しかない。はずだが、ちょっと形状に曲面を持たせる為ModifierでSubsurf、SimpleDeformで962頂点に膨れ上がってる(※ええ、制作上の手抜きですw)。
ダイアル年x4、月x2、日x2で8個x上下2パーツで16個。
962x16=15392頂点。
つまり全体の7割以上を占めている。ここを詰めれば多分もっと軽くできる。
が、とりあえずDrawCallも40台でfpsも30以上でているので、このまま放置でいきます(ぁ。
※テクスチャに陰影を書き込んでいるので、20頂点のシリンダでも大丈夫そうですけどね・・・まぁ負荷テストにもなるので。C#のコード実装を優先で|-`)
■なんとなくまとめ
まじめにゲーム製作で動くユニットが多くなると多分2万頂点でも多いかも?ということがなんとなく予想できる。ここらを指標にモデリングしていくと調整しやすいかもしれない。
やはり陰影のテクスチャベイクはUnityでも有効手段。必須かもしれない。法線マップはきつそうかな?。
そしてやっぱりモデルの頂点数を減らすのは王道ですね・・・。
3D fpsゲーム等で光源効果を使う演出(Spotライト等)は効果範囲をかなり限定的に(対象オブジェクト、レイヤ)うまく使わないと簡単に重くなりそうである。
Unity Pro版の機能がすごい良さそうですねぇ。ガチで3Dゲームだとすごく欲しくなりそう。
静的バッチングとか使いたくなりそうな機能がことごとくPro版のみになっている(アタリマエか
ちなみにお値段は、
Unity Pro本体:157500円
Android Pro:157500円
計 315000円。
ガチすぎます。仕事でこないとちょっと手だしにくいですねこれは;(苦笑