理工学部2回生のゆずです。
Unityの最適化について
と、その前に…
using System.Collections; using System.Collections.Generic; using UnityEngine;public class Sample : MonoBehaviour {void Update () {transform.position +=Vector3.forward* 10 * Time.deltaTime; } } |
こんなコードがあったとします。
もちろんこれはダメです
transform.positionは GetComponent<Transform>().position
と同じでGetComponentを行っています
Rigidbody等ではキャッシュを行えという記事は多いのですが
なぜかTransformはほとんどキャッシュしていない…??
using System.Collections; using System.Collections.Generic; using UnityEngine;public class Sample : MonoBehaviour {private Transform Trans;void Start () { //Tras=GetComponent<Transform>(); Trans = transform; }void Update(){ Trans.transform.position += Vector3.forward * 10 * Time.deltaTime; } } |
と前置きは置いといて
Unityの最適化には大きく分けて2つあります。
-
Unity C#(コード)の最適化
-
C#以外の最適化
使用バージョン Unity 2017.2.0f3 plus
今回は2のC#以外のSetPass callsと
Batchesの最適化について解説します
SetPass callsは主に画像の読み込み数
Batchesはマテリアルのmeshへのバッチ数です。
SetPass callsを減らすには
例えば右のようにテクスチャ4枚を1枚にするなど、、
2Dゲームでも複数スプライト画像を1枚にするとかなり効果があります。
自動でスプライトをパッキングしてくれる
おすすめのエディタ拡張
【Unity】スプライトを1枚にまとめる簡易SpritePacker
Batches数はマテリアルを減らす、また同じマテリアルを使うことで減らすことができます。
なので多くマテリアルを作らず1つにまとめることが重要です。(MeshBakerを使うなど…)
同じマテリアルを使用しても、影がONになっていると効果ないです。
(影は個々のマテリアルによって変わるため)
なお同じマテリアルを用意してもゲームスタート時にBatches数が減るので
このオブジェクト数200で作られたマップではプレイ前はBatches数が200ですが
プレイ時は5にまで減ります!!
かなり軽くなります。
ちなみにモバイルのBatches数の目安は100以下です。
これ以外にも最適化方法はまだまだありますが
最適化にはそのゲームによってやり方は異なります。
重いゲームほど苦になるゲームはないでしょう!
どのゲームとはいいませんが…
自分の作ってるゲームは重くありませんか?
少しでも重いなと思ったらぜひ最適化をしてみましょう。
おすすめ参考資料
Profilerの使い方が分かりやすく載っています
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術