【Unity】Color vs Color32

Color vs Color32 Unity
Color vs Color32
バージョン
  • Unity 2022.3.45f1

Unityの色を司る構造体ColorColor32の比較です。

c#標準ライブラリの「System.Drawing.Color」ではありません。

結論

ちりつもになるので基本はColor32、高精度の色を表現したい箇所だけColor!

テスト環境

空のオブジェクトに以下のスクリプトをアタッチします。

using UnityEngine;
using System;

public class ColorVsColor32 : MonoBehaviour
{
    private int testCnt = 1000000;

    void Start()
    {
        //Colorメモリ使用量
        Debug.Log($"Color: {GetColorMemory():F2}KB");

        //リセット
        ResetMemory();

        //Color32メモリ使用量
        Debug.Log($"Color32: {GetColor32Memory():F2}KB");
    }

    private float GetColorMemory()
    {
        long startMemory = GC.GetTotalMemory(true);
        Color[] colors = new Color[testCnt];

        for (int i = 0; i < testCnt; i++)
        {
            colors[i] = new Color(1.0f, 0.0f, 0.0f, 1.0f);
        }
        long endMemory = GC.GetTotalMemory(true);

        return (endMemory - startMemory) / 1024f;
    }

    private void ResetMemory()
    {
        GC.Collect();
        GC.WaitForPendingFinalizers();
    }

    private float GetColor32Memory()
    {
        long startMemory = GC.GetTotalMemory(true);
        Color32[] color32s = new Color32[testCnt];

        for (int i = 0; i < testCnt; i++)
        {
            color32s[i] = new Color32(255, 0, 0, 255);
        }
        long endMemory = GC.GetTotalMemory(true);

        return (endMemory - startMemory) / 1024f;
    }
}

ColorColor32のインスタンスをそれぞれ100万個生成してメモリ使用量を確認します。

検証

上記スクリプトの実行結果は次のようになりました。

Color vs Color32

Color32の方がメモリ使用量が少なくなりました。

Colorのfloat型が1成分のデータにつき32ビット、Color32ではbyte型で8ビットのためColorの方が約4倍のメモリ消費となります。微々たる差ではありますが、Color32に軍配が上がる結果となりました。

構造体色成分のデータ型データ量/データ合計データ量
Colorfloat32ビット128ビット(16バイト)
Color32byte8ビット32ビット(4バイト)

まとめ

Color32の勝利!!
めちゃくちゃ色のこだわりがあったり、大量の色情報を扱う等が無い限り、通常はColor32を使った方がメモリ効率は良いです。
とはいえ、ほとんど差がないためコードの好みで良いかと思います。

Color - Unity スクリプトリファレンス
RGBA カラーの表現をします。
Color32 - Unity スクリプトリファレンス
32 ビット形式での RGBA の色の表現をします。

タイトルとURLをコピーしました