Untiy 遍历Texture2D效率优化
因为项目中需要对2D图片进行加工,需要遍历图片中像素点的颜色首先想到的方式:
GetPixel()
Color[] colors = new Color[texture2D.width * texture2D.height];
for (int x = 0; x < texture2D.width; x++)
{
for (int y = 0; y < texture2D.height; y++)
{
colors[x * y + y] = texture2D.GetPixel(x, y);
}
}
发现执行效率比较低,一张图片的分辨率为1080*864运行时间大概是200ms,后面发现了GetPixels()这个函数,测试了一下效率是之前的约20倍:
GetPixels()
Color[] colors = new Color[texture2D.width * texture2D.height];
Color[] txtColors = texture2D.GetPixels();
for (int i= 0; i< colors.Length; i++)
{
colors[i] = txtColors[i];
}
下面分别把两个函数分别运行10次然后对比一下时间:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Demo : MonoBehaviour
{
public Texture2D texture2D;
// Start is called before the first frame update
void Start()
{
tick(() =>
{
for (int i = 0; i < 10; i++)
{
Color[] colors = new Color[texture2D.width * texture2D.height];
for (int x = 0; x < texture2D.width; x++)
{
for (int y = 0; y < texture2D.height; y++)
{
colors[x * y + y] = texture2D.GetPixel(x, y);
}
}
}
}, "GetPixel");
tick(() =>
{
for (int i = 0; i < 10; i++)
{
Color[] colors = new Color[texture2D.width * texture2D.height];
Color[] txtColors = texture2D.GetPixels();
for (int j = 0; j < colors.Length; j++)
{
colors[j] = txtColors[j];
}
}
}, "GetPixels");
}
void tick(Action action,string Title= "Time")
{
int start = System.Environment.TickCount;
action();
int end = System.Environment.TickCount;
Debug.Log(Title + ":" + (end - start) + "ms");//单位毫秒
}
// Update is called once per frame
void Update()
{
}
}
可以看到结果: