Unityプロジェクトの軽量化・高速化の施策

概要

製品リリース時に、実行ファイルの軽量化と、端末での快適な動作を保証することは重要です。

過去に下記のような失敗がありました。

  • 実行ファイルが大きくなりwifi環境でないとDLできない
  • 巨大なファイルをメモリに保管する必要があり端末が不安定になる
  • 巨大なファイルを読み込むためロードに時間がかかりストレス
  • 「リスタート」等でファイルを複数読み込みメモリに入らず落ちる
  • 開発終盤でデータの見直しをするため不具合が多発する
  • データの見直しをするための時間がかかる
  • gitレポジトリが重くなり凍結される

これらを繰り返さないためにも製品プロジェクトを開始作成した時点から、プロジェクトに関わる全員が意識をしてデータとコードを作っていきましょう。

データ軽量化のテクニック

効果

メモリに大量のデータが読み込まれた場合の端末のクラッシュを防ぎます。

アプリのダウンロード時間、シーンのロード時間が短くなります。

手順

不要なデータの削除

  • 重複しているファイルはないか
  • 不要なファイルが残っていないか
    • 意図せず読み込む事故につながるので使わない時点で消しておく

データの最適化

テクスチャ編

  • 必要以上に大きいテクスチャを小さくする
    • スプライトアトラスのパッキングで元データの大きさが反映されるのでゲーム中の解像度を考え、適切なサイズにすること
  • 4の倍数になっていないテクスチャをリサイズする
    • スプライトアトラス化するテクスチャは必須でないが最後まで何をパッキングするかは分からないので作法として行いたい

テキスト編

  • TextMeshProのFontAssetCreatrorを使用し、文字アセットを作成する

スプライトアトラスの設定

Asset Call Pathを減らす高速化の効果も期待できますが、容量も小さくなります。

  • カメラに同時に映る可能性があるテクスチャをまとめる
  • パッキング後、半透明な領域が大きいものは整理する
    • 不要なデータをGPUに転送することになるので避ける
    • 別のスプライトアトラスに移動したり、そもそもアトラス化しない
  • オプションの回転・タイト配置は、稀に見た目がおかしくなる
    • 2018.2で発生

書き出し設定

テクスチャ編

iOS
  • 透明あり: PVRTC_RGBA4
  • 透明なし: PVRTC_RGB4
Android
  • 透明あり: ETC2_8Crunched
  • 透明なし: ETC2_RGB4
  • 透明あり: DXT5Crunched
  • 透明なし: DXT1Crunched

サウンド編

  • BGM: Streaming, Vorbis 20 - 40
  • SE: Decompress On Load, Vorbis 20 - 30

ログによる容量の確認

  • Console / Open Editor Log
    • Unity Could Build / VIEW DETAIL / FULL LOG でも確認できる

 

おまけ:アセットバンドル

アセットバンドル化することで圧縮が期待できますが、展開まで時間がかかり、圧縮前の容量がメモリに置かれるようです。実装の手間もかかり、またエディタ上で確認ができないので、特別な理由がない限り利用を避けたほうが良いでしょう。

高速化のテクニック

効果

フレームレートが改善でき、バッテリーにも優しくなります。

手順

検査ツールの準備

  • Stats: Gameウィンドウのタブから
    • Batches と Saved by batching (アトラスで効果) に注目
  • Profiler: Window / Analisys / Profiler
    • まとめ中
  • Frame Debuger: Window / Analisys / Frame Debuger
    • まとめ中

自動ビルド環境

  • Unity Cloud Build
    • ビルドが終わったらSlackに通知
  • 利点
    • Switch Platform の時間節約, ファイル入れ替えの不具合を防ぐ
    • 共有が簡単に
    • 容量を開発初期のころから気にするようになる

各種最適化設定

エディタ編

  • 不要な非アクティブになっているオブジェクトの削除
    • 非アクティブになっていてもロードされてしまうという噂

描画編

  • 板状のものは、PlaneでなくQuadを使用する
    • Planeのポリゴン量はとても多い
    • メッシュは1つにベイクする(これから検証)
    • スプライトパッカー
    • 透明なもののレンダラーを切る
      • 透明だとしても描画されてしまう
      • 画面に対する描画領域が大きいものは特に注意すること
      • 全体に色を塗るのであればカメラのBackgroundColorを利用する
      • カメラのBackgroundColorが見えないのであればDon'tClear
      • 光源および影はなるべく使用しない

        ソースコード編

        • Update内で重い処理をしない
          • Find, GetComponent 等、の取得系
          • new演算子を使わない
            • Unityや言語の進化で改善の可能性あり
        • Debug.Logはビルド時に動かさない設定
        • ユーザの活動具合を観察しフレームレートを落とす処理