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();
    }
}