Unity SetActiveとColorの処理はどっちが軽いのか?
どうも、かなり久しぶりの投稿となります。
パイポイです。
といっても読者は0人だったので、あんまり関係ないかもしれませんが…
さて、今回は個人的に気になっていた
『UnityのSetActiveとColorの処理はどっちが軽いのか』
について検証いたしました。
オブジェクトを非表示にしたいときに、どちらを使えば軽い処理になるのか気になっていたのですが、この度、自分流の方法で検証してみました。
ソースコードは下の方に載せておきますが、大まかな流れとしては
・Update()の中で1000個のプレハブに対して、『SetActive』 or 『Colorのα値の切り替え』を行います。
・Update()毎にfps_countを加算して、10秒後にその処理をInvokeで停止します。
・fps_countを10で割った値を表示させます。
詳しくはソースコードから理解してください(クソコードですが…)
それでは早速、5回ずつ計測した結果は以下に記載します。
SetActive (平均15.8)
15.9
16.1
15.6
15.7
15.7
Color (平均29.22)
28.7
30.1
28.8
28.7
29.8
Colorの方がfpsが出ていますね。
しかも、GetComponentを使っているのにも関わらず…
自分の中で、
・GetComponentは重い
・SetActiveは軽い(Destroyに比べて)
・Colorのα値の計算は重い
っていう曖昧な知識があったのですが、実際に計測してみるとColorの方が2倍くらいfpsが出ていることが分かりました!
検証方法がおかしいということも考えられますが…(笑)
どうぞ、参考程度に
ソースコード
using UnityEngine;
using UnityEngine.UI;public class Active_Color : MonoBehaviour
{
[SerializeField] Text fps_text;const int prefab_num = 1000;
float fps_count = 0;
bool is_start = false;
bool is_active = true;
int alpha = 1;[SerializeField] GameObject Prefab;
GameObject[] Prefab_List = new GameObject[prefab_num];
void Start()
{
for (int i = 0; i < prefab_num; i++)
{
GameObject obj_prefab = Instantiate(Prefab) as GameObject;
Prefab_List[i] = obj_prefab;
}is_start = true;
Invoke("Stop_Count", 10);
}
void Update()
{
if (is_start)
{
//SetActive
for (int i = 0; i < prefab_num; i++)
{
Prefab_List[i].SetActive(is_active);
}
is_active = !is_active;//Color
/*
for (int i = 0; i < prefab_num; i++)
{
Prefab_List[i].GetComponent<Image>().color = new Color(1, 1, 1, alpha);
}
alpha = 1 - alpha;
*/fps_count++;
}
}void Stop_Count()
{
is_start = false;
fps_text.text = "FPS is " + (fps_count / 10).ToString();
}
}