はじめに
JKコンバットオンラインを作る際に、ゲームの舞台となる校舎のアセットがモバイル用では無かったため、なんとか軽くしようとしてみました。
JKコンバットオンライン 予約トップ10 iOS
JKコンバットオンライン 予約トップ10 Android
結果、劣化はあるもののそれなりにモバイル用ではないアセットも使うことができました。
Japanese School Buildings Kit
実際にJKコンバットオンラインに使った校舎のアセットは以下のJapanese School Buildings Kitです。
Japanese School Buildings Kit | 3D Urban | Unity Asset Store |
見ての通り、高クオリティなのですが、その分かなり重い…
でもこれで$30は安い…!
Draw Calls
Japanese School Buildings Kitに入ってるサンプルのDraw Callsを見てみると、
1306!
モバイル端末でFPSを30に保つための目安が100ぐらいなので、このままではさすがに使えない…
なんとかDraw Callsを減らそうとterrainやライトを消しても…
1223…根本的になにかを変えないと使えそうにないという結論に。
Mesh Baker
Draw Callsが多いのは、大量のオブジェクトがあってメッシュも大量にあるのが原因です。
だったらメッシュまとめればいいんじゃね?
ってことで登場、Mesh Baker。
複数のメッシュをまとめてくれるようです。
Mesh Baker - Asset Store |
それでは、上記のブログを参考にこれを使っていきます。
Baker作成
もろもろの処理をしてくれるBakerを
[GameObject]-[Create Other]-[Mesh Baker]-[Multi-mesh And Material Baker]
から作成。
これでHierarchyにMeshBaker0というゲームオブジェクトが作成されるはずです。
また、頂点数が64000を超えない場合は[Mesh And Materi Baker]でいいようです。
結合するメッシュを選択
さきほど生成されたMeshBaker0のOpenTools For Adding Objectsを押すと、
MB3_MeshBakerというウィンドウが表示されます。
結合したいメッシュを一つのゲームオブジェクトにまとめて、そのゲームオブジェクト(今回はBuildings)を選択した状態でMB3_MeshBakerのAdd Selected Meshesを押すと、
Buildings以下の全てのメッシュが選択されます。
ただし、アクティブ状態でないゲームオブジェクトのメッシュは含まれません。
アセット作成
[Create Empty Assets For Combined Material]を押してアセットを作成します。
正直、なんのアセットか分かってないです…結合した結果を保持している?
シェーダ毎にマテリアルを作成
Multiple Combined Mateにチェックを入れるとBuild Source To…というボタンが現れます
これを押すと使用されてるシェーダ毎にマテリアルが作成されます。
しかし、この設定をするとメッシュを結合したあと、Draw Callsは減るのですがはTris(ポリゴン数)とVerts(頂点数)は増えるので、場合によってはしない方が良いかもしれません。(JKコンバットオンラインではしていない。)
マテリアルを結合
[Bake Materials Into Combined Material]を押すとマテリアルの結合が始まります。
無事完了するとログに[Report]と表示され、Projectにマテリアルやまとめられたテクスチャが生成されています。
メッシュが多いとかなり時間がかかるので、気長に待ちましょう。
メッシュ結合
[MB3_Multi Mesh Baker]の[Bake]を押すとメッシュの結合が行われます。
また、[Max Verts in Mesh]で一つのメッシュの最大頂点数を設定できます。
ただし、頂点数を減らすわけではなく、メッシュを分割するだけなので注意が必要です。
これでHierarchy上にCombinedMesh-MeshBaker0というメッシュが結合されたオブジェクトが生成されています。
結果
素の場合、シェーダ毎にマテリアルを作成した場合、シェーダを一つにした場合で比較しています。
縮尺があってないのはご愛嬌!
シェーダが複数でもDrawCallsが41!、
シェーダが一つの場合に至っては6!!
また、シェーダが複数あるとTris135.9k、Verts498.3kだったのに対し、
一つの場合はTris95.2k、Verts136.2kとかなりの差があり、結局シェーダ一つ場合を採用しました。
LOD
処理を軽くすにはLODという技術もあるようです。
LOD(Level of Detail)とは視点に近く大きく表示されるモデルはハイポリで、視点から遠く小さく描かれがちなものについてはポリゴン数の少ない3Dモデルに切り換える技術。
Mesh Baker LODやSimplygonといったモノがあるようですが、使いこなせませんでした…
多少使った感じだと、大きなオブジェクトに使うというよりは、小さいオブジェクトが多数ある場合に使うのかな?といった印象です。
余談
今回、メッシュを結合しようと思った経緯はAndroid版でのFPSが30を切ってしまっていたからです。
(iPhone5SとかだとDrawCallsが800ぐらいあってもFPS30出てしまう)
それで、実際DrawCallsを減らしたらAndroidでもFPSが30超えたかというと超えませんでした。
AndroidでFPSが低下する一番の原因は、実はeveryplayによりプレイ動画の撮影(Lobiも同様)でした…
iOSだと特に動画撮影の影響は見えないのですが、Androidではどうやらキツい様子なので、Android版は動画撮影を諦め、無事FPSが30超えたというオチでした!
まぁ、DrawCallsが減った事自体は良かったですけどね〜