win standaloneゲームをAndroidに移植した話

Unity
  • Unity2019.1.12f
  • LegacyPipeline
  • Resourcesのみ
  • Github private repository
  • jenkins

windows限定でリリースしたゲームを後からandroidに移植しました。その時の知見をまとめました。

グラフィック仕様

主人公男

  • 6mesh
  • 36000 tirs
  • 1k3枚、512 2枚 Albedo only
  • Uber shader

ヒロイン

  • vroidをblenderでカスタム
  • 7mesh + 追加アクセサリ4mesh(ただし顔はsubmesh多数
  • 34000 tris
  • 1k か512が基本サイズ
  • Albedo Metalic Normal Occlusion(解像度はケースバイケース、見た目に違和感ないなら可能な限り縮めた
  • Uber shader

背景

  • さまざまなアセットを使用しているため頂点数やテクスチャサイズに統一感なし
  • windowsならメモリは潤沢と考え1kを基準にしているがテクスチャ枚数は気にしなかった
  • 一番大きいシーンでキャラ込み約49万 tris
  • Standard shader

Branchを分ける

完全に特殊対応になる。また売り切りゲームでアップデート予定もないのでBranch分けて独自進化させるのがよいと考えました。

一部バグ修正はチェリーピックでstandalone branchにもっていきました。

そのためandroid固有コミットとstandaloneにもってくであろうバグ修正コミットは明確にわけるようにしました。

VirtualPad

UIに関しては、もともとマウス・キーボードとパッド操作両方に対応していたので何もしなくてもAndroidで動作しました。

キャラクター操作はバーチャルパッドを導入しました。

そのままAndroidで動かしてみる

nexus5xで15fps~60fpsで動きました。シーンによる負荷の差が大きかったです。Uber shaderが正常に表示されたのは助かりました。

ただしいくつか表示バグがあったので個別対応しました

鏡シェーダー

全画面異常な見た目になりました。standard shaderで反射率高くしてreflection probeで誤魔化しました

水面シェーダー

表示が異常でした。standard shaderで代用しました。

ポストプロセスシェーダー

postprocessing stackv2 ブラーがダメでした。全体的に表示が変になったのと負荷が気になったので全部カットしました。Legacy Pipelineモバイルではモバイルに最適化してるものを使わないとダメそうです。

Alembic

モバイル非対応なのでparticleで代用するか、全カットしました。VATで代用できないか検証しましたが、Blenderから作るのが難しかったのでやめました。

TextmeshPro

Androidだけ発生しました

最適化

Profilerで確認したところCPU、GPUがまんべんなく重かったです。ピンポイントでボトルネックがあるわけではなかったです。一方で脱出ゲームとしては遊べるくらいの負荷です middle品質で nexus5xで15fps~60fps

オクルージョンカリング

室内ゲームで扉が自動で開くことで端から端まで見通せるためそもそも相性が悪かったです。たいしてカリングできないわりに、不自然に消えたりすることがありました。使いませんでした。

GPUインスタンシング

4m×4mを基準にしたモジュラーモデリングのためオブジェクト数はかなり多いです。そのためGPUインスタンシングを有効にすればCPU負荷減るんじゃと思い設定してみましたが、劇的によくなるとかはなかったです。同一オブジェクト自体はそんなに多くないため、あまりメリットがなかったようです

static batchの廃止

ロード時間が大幅に短くなりました。windowsでは気にならなかったのですが、モバイルでは負荷が高すぎたようです。廃止したことによるcpu負荷の上昇は特にありませんでした。

Build Logで不必要なリソースの削除

謎の2k textureがあったので削除しました。

テクスチャ解像度下げる

メモリ使用量は減りましたが、それ以外は何も起きません。Android killされにくくなるだろうくらいの気持ちで大きいテクスチャを中心に512まで小さくしました。

そして

オブジェクト数を減らすのが一番効果あったのですが、2015年発売のnexus5xで一応遊べるので、割と新しめの端末なら十分快適に遊べるだろうという判断でこれ以上の最適化はやめました。