Unity環境でAndroidアプリを最適化しよう!

Unity

最適化をしよう!

ここからが実際取り組んだ最適化方法です。
私の場合は描画が重かったのでその対応がほとんどとなります。
ではレッツ最適化!

 

最適化案1:動かないオブジェクトをStaticにする

動かないオブジェクトやプレハブを選択して「Inspector」タブに下記のような「Static(赤丸)」という項目があります。これを設定するだけで軽くなるので便利です。

基本的にシーンで動かないオブジェクトに対して設定してください

内部の処理的にはカリング(画面外の見えないものを表示しない機能)したり、マテリアルが同じモノをまとめて描画して手順を間引いたりして高速化を実現しているようですね。

ただ非常に簡単に対応できるのでぜひ対応してみたい項目ですね。

 

最適化案2:テクスチャをまとめる

テクスチャをまとめるというのは要するに複数の画像が1つの画像にまとめることを意味します。

開発中のゲームではこんな感じです。

テクスチャをまとめて処理が軽減出来る理由

なぜ軽くなるかと言うと一般的な描画エンジンではポリゴン(CGの大本になっている三角形)を描画するには基本的に下記のような手順を踏みます。

  • 頂点を設定
  • マテリアル(シェーダ)を設定
  • テクスチャ(画像)を設定

そしてこの要素が一つでも変更があるとまた設定し直す必要があります。
例えばポリゴンの「頂点を設定」部分はオブジェクトごとに場所が違うのでオブジェクト毎に更新されます

ではそれ以外はどうでしょうか?
例えば今回の「テクスチャ(画像)を設定」は1つ前に描画されたポリゴンと画像が違う場合、再設定が必要になってしまうんです。

ただ、そんな時
もし1枚の画像にまとめられていれば画像の差し替えの手間が省けるので
処理を軽くすることができるということなのです!

 

 

Unityのテクスチャをまとめる機能を使う

そしてUnityでは簡単にテクスチャをまとめる機能があります。
めちゃくちゃ便利です。

一昔前は手作業でまとめたり、コンバータを実装してWindowsコマンドなんかでまとめたりしてましたから。うーん、本当に時代は変わりましたね。

そして、そのまとめるファイル形式が「Sprite Atlas」、機能としての名前は「Sprite Packer」と呼ぶようですね。

Sprite Atlasファイルを作る

では作っていきたいと思いますが実際のファイルはこんな感じです。

そしてその作り方はProjectタブの中で右クリック→Create→Sprite Atlas(赤丸のところ)から作ることができます。

Sprite Atlasにスプライトまとめる

ファイルできたので早速画像をまとめてみます。今回のケースではステージごとに読み分けないので画像をすべてまとめている「Sprites」フォルダの画像を全部まとめています。

「Objects for Packing」という項目の+ボタンを押して、Spriteをまとめているフォルダをドラッグアンドドロップするだけです。

 

仕上げにSprite Packerを有効にする

では最後にまとめた画像が実際アプリで使われるように設定します。

「Project Setting」ウィンドウを開いて、「Sprite Packer→Mode」の項目を「Enable for Builds」に変更します。

これで無事Androidでテクスチャまとめられるようになりました!

「Always Enable」にするとエディタ実行でも「Sprite Packer」が使われるようになります。ただ変換などに若干時間を要すため、あくまで動作確認用として利用しましょう。

これらの設定でSprite Packerの機能が使われるようになったはずです。
実機やエディタで確認して問題なければOKです。

 

Sprite Packerで問題が起こった

今回初めて使ってみたのですが
実際SpritePackerを有効にしてAndroid動かしてみると下記のような問題がおきました。

  1. UIの端に別のテクスチャが見える
  2. エミッシブと呼ばれる画面の一定以上の明るいところに
    発光したようなエフェクトを掛けるのが弱くなった

ということが起きました。

1.は単純に「Sprite Atlas」のInspectorタブの設定にある、「Allow Rotation(回転許容)」、「Tight Packing(間隔キツめにまとめる)」を無効にして、「Padding(他の画像との余白)」を8に変更して他の画像との間隔がおかしくならないように修正しました。

2.が非常に厄介で元々Unity社が提供する2DGameKitというものを利用していたため、そのサンプルで用意されていたシェーダー(.Shader)が引き起こしていたようです。色々設定を変えても全く原因がわからず、結局使っていない機能も多かったので必要な機能だけを抜き取って再実装したものを使ったら正常に戻りました

要らない機能を削ってシェーダ自体がシンプルになり以前より処理が軽くなる事も考えられたのでそういう意図で削減したのをもありますね~

コメント

スポンサーリンク
タイトルとURLをコピーしました