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

夏までにiPhone アプリつくってみっか!

趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。

【Unity5でレースゲーム】フレームレートアップのため高速化にチャレンジ

オープンワールドレーシングゲーム Unity

前回、フレームレートを表示してみて、ちょっとレースゲームとして物足りない20fpsという事が判明しました。

フレームレートが一番きついスタート後のストレートで測定した値です。
f:id:takujidev:20150720183608j:plain
前回の記事:tf.hateblo.jp

20fpsという値は低いとは言え、サターン用デイトナUSAが20fpsだったので遊べなくはないレベルではあります。
専用チップをカセットに搭載し、毎秒9000ポリゴン表示を可能にしたメガドライブバーチャレーシングは15fps(参考:IQGamer: Retro Tech Analysis: Virtua Racing (MD vs 32X))でポリゴンもガックガクでしたが当時はそんな事は一切気にならず、大喜びで遊んでいました。

さて、高速化についてですが、まず試したのが街のオブジェクトのスタティック化です。
街全体を選択した状態でインスペクター右上のStatic右側の三角印をクリックしてBatching Staticにチェックを入れます。
普通にStaticの左側のチェックボックスをチェックするとパソコンのCPU負荷が100%の状態で何10分待っても処理が終わらないのであきらめました。

f:id:takujidev:20150720184750j:plain

これだけでフレームレートが10fps向上し30fpsになりました!

次はオクルージョンカリングに挑戦してみます。
街のオブジェクトのOccluder Staticにチェックを入れ、Occlusion Culling画面の設定はデフォールトのままでBakeして見ました。これだけでオクルージョンカリングが有効になります。
無効にするにはカメラのOcclusion Cullingのチェックを外せばOKです。
早速試してみます。

f:id:takujidev:20150720191014j:plain

約33fps.... 期待したほどの効果はありませんでした。

というのも、この場面では除外されるオブジェクトがそれほど多くないためです。

オクルージョンカリングがOFFの時に描画されるオブジェクトはこんな感じです。
f:id:takujidev:20150720191607j:plain

ONにすると画面左側の三角形の領域と画面右下の部分のオブジェクトが減っていますが、トータルで見るとそれほど減っていません。
f:id:takujidev:20150720191730j:plain

最後に、Edit > Project Setting > QualityでV Sync CountをDon't Syncにしてみました。

f:id:takujidev:20150720205702j:plain

48fpsとかなり向上しました。ただ、V SyncをOFFにするとコーナーリング時など画面が激しく左右に動くときに若干画像が乱れることがあります。

オクルージョンカリングの話に戻りますが、オクルージョンカリングがONのとき、木のオブジェクトのような透明部分があるオブジェクトの向こう側のオブジェクトが表示されないことに気がつきました。

木の根元に車を寄せたとき、オクルージョンカリングOFFのとき見えていた遠景が、ONにすると消えてしまいます。
OFFのとき
f:id:takujidev:20150720193958j:plain
ONのとき
f:id:takujidev:20150720194003j:plain

木は本当は巨大な四角いポリゴンでできているのですが、透明部分があるテクスチャーにより木の形に見えます。
そして、木を四角いポリゴンとして扱ってしまうため奥のオブジェクトを非表示にしてしまっているようです。
これは影についても同様で、木の根元の何もない空間に影が落ちたり、逆に木の影が四角になったりするのがずっと気になっていました。

そして、ようやくこれらを一気に解決する方法がわかりました。
WalkRoadの子オブジェクトのwalk_block_Aからwalk_block_IにTransPという文字が含まれているマテリアルが3つあり、su_Double_Clipというシェーダーが設定されているのですが、これをNature/Tree Soft Occlusion Leavesに変更すると、あらま、影は綺麗な木の形になりました。
そして、一旦Occlusion Cullingの設定でClearしてから再Bakeすると、オクルージョンカリングがONでも木の向こうのオブジェクトが正しく表示されるようになりました。
f:id:takujidev:20150720204449j:plain
そして、何故かガードレールのデザインも表示されるようになりました。
シェーダーを元に戻すとこうなります。
f:id:takujidev:20150720204810j:plain