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

(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

Mesh Bakerを使ってメッシュをまとめ、Draw Callsを1306から6にしてみた【Unity】【アセット】


このエントリーをはてなブックマークに追加

はじめに

JKコンバットオンラインを作る際に、ゲームの舞台となる校舎のアセットがモバイル用では無かったため、なんとか軽くしようとしてみました。

f:id:kan_kikuchi:20141207221254j:plain

JKコンバットオンライン 予約トップ10 iOS
JKコンバットオンライン 予約トップ10 Android

結果、劣化はあるもののそれなりにモバイル用ではないアセットも使うことができました

Japanese School Buildings Kit

実際にJKコンバットオンラインに使った校舎のアセットは以下のJapanese School Buildings Kitです。


見ての通り、高クオリティなのですが、その分かなり重い…
でもこれで$30は安い…!


Draw Calls

Japanese School Buildings Kitに入ってるサンプルのDraw Callsを見てみると、

f:id:kan_kikuchi:20141214081007j:plain

1306!
モバイル端末でFPSを30に保つための目安が100ぐらいなので、このままではさすがに使えない…

なんとかDraw Callsを減らそうとterrainやライトを消しても…

f:id:kan_kikuchi:20141214081245j:plain

1223…根本的になにかを変えないと使えそうにないという結論に。


Mesh Baker

Draw Callsが多いのは、大量のオブジェクトがあってメッシュも大量にあるのが原因です。
だったらメッシュまとめればいいんじゃね?
ってことで登場、Mesh Baker
複数のメッシュをまとめてくれるようです。

それでは、上記のブログを参考にこれを使っていきます。

Baker作成

もろもろの処理をしてくれるBakerを
[GameObject]-[Create Other]-[Mesh Baker]-[Multi-mesh And Material Baker]
から作成。

f:id:kan_kikuchi:20141214085300j:plain

これでHierarchyにMeshBaker0というゲームオブジェクトが作成されるはずです。
また、頂点数が64000を超えない場合は[Mesh And Materi Baker]でいいようです。

結合するメッシュを選択

さきほど生成されたMeshBaker0のOpenTools For Adding Objectsを押すと、

f:id:kan_kikuchi:20141214085803j:plain

MB3_MeshBakerというウィンドウが表示されます。
結合したいメッシュを一つのゲームオブジェクトにまとめて、そのゲームオブジェクト(今回はBuildings)を選択した状態でMB3_MeshBakerのAdd Selected Meshesを押すと、

f:id:kan_kikuchi:20141214090334j:plain

Buildings以下の全てのメッシュが選択されます。

f:id:kan_kikuchi:20141214090750j:plain

ただし、アクティブ状態でないゲームオブジェクトのメッシュは含まれません

アセット作成

[Create Empty Assets For Combined Material]を押してアセットを作成します。

f:id:kan_kikuchi:20141214092933j:plain

正直、なんのアセットか分かってないです…結合した結果を保持している?

シェーダ毎にマテリアルを作成

Multiple Combined Mateにチェックを入れるとBuild Source To…というボタンが現れます

f:id:kan_kikuchi:20141214091041j:plain

これを押すと使用されてるシェーダ毎にマテリアルが作成されます。

f:id:kan_kikuchi:20141214091232j:plain

しかし、この設定をするとメッシュを結合したあと、Draw Callsは減るのですがはTris(ポリゴン数)とVerts(頂点数)は増えるので、場合によってはしない方が良いかもしれません。(JKコンバットオンラインではしていない。)

マテリアルを結合

[Bake Materials Into Combined Material]を押すとマテリアルの結合が始まります。

f:id:kan_kikuchi:20141214092022j:plain

無事完了するとログに[Report]と表示され、Projectにマテリアルやまとめられたテクスチャが生成されています。

f:id:kan_kikuchi:20141214092414j:plain

メッシュが多いとかなり時間がかかるので、気長に待ちましょう。

メッシュ結合

[MB3_Multi Mesh Baker]の[Bake]を押すとメッシュの結合が行われます。

f:id:kan_kikuchi:20141214093442j:plain

また、[Max Verts in Mesh]で一つのメッシュの最大頂点数を設定できます。
ただし、頂点数を減らすわけではなく、メッシュを分割するだけなので注意が必要です。

f:id:kan_kikuchi:20141214094530j:plain

これでHierarchy上にCombinedMesh-MeshBaker0というメッシュが結合されたオブジェクトが生成されています。


結果

素の場合、シェーダ毎にマテリアルを作成した場合、シェーダを一つにした場合で比較しています。
縮尺があってないのはご愛嬌!

f:id:kan_kikuchi:20141214101258j:plain

シェーダが複数でもDrawCallsが41!
シェーダが一つの場合に至っては6!!

また、シェーダが複数あるとTris135.9k、Verts498.3kだったのに対し、
一つの場合はTris95.2k、Verts136.2kとかなりの差があり、結局シェーダ一つ場合を採用しました。


LOD

処理を軽くすにはLODという技術もあるようです。

LOD(Level of Detail)とは視点に近く大きく表示されるモデルはハイポリで、視点から遠く小さく描かれがちなものについてはポリゴン数の少ない3Dモデルに切り換える技術。

Mesh Baker LODSimplygonといったモノがあるようですが、使いこなせませんでした…

多少使った感じだと、大きなオブジェクトに使うというよりは、小さいオブジェクトが多数ある場合に使うのかな?といった印象です。


余談

今回、メッシュを結合しようと思った経緯はAndroid版でのFPSが30を切ってしまっていたからです。
(iPhone5SとかだとDrawCallsが800ぐらいあってもFPS30出てしまう)

それで、実際DrawCallsを減らしたらAndroidでもFPSが30超えたかというと超えませんでした。

AndroidでFPSが低下する一番の原因は、実はeveryplayによりプレイ動画の撮影(Lobiも同様)でした…
iOSだと特に動画撮影の影響は見えないのですが、Androidではどうやらキツい様子なので、Android版は動画撮影を諦め、無事FPSが30超えたというオチでした!

まぁ、DrawCallsが減った事自体は良かったですけどね〜