Untiy 遍历Texture2D效率优化
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() { } }
可以看到结果: