关于Array.Copy 和 GC
//一个简单的 数组copy 什么情况下会触发GC呢
[ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
public static void Copy(Array sourceArray,
long sourceIndex,
Array destinationArray,
long destinationIndex,
long length);
当源和目标的类型不一致,由小转大,比如由byte 到 short ,int 都会触发GC ,我不知道内部机制如何,可能是拆装箱导致的 ,不确定,不过在实际开发中确实出现了这种问题,所以使用的时候 类型要匹配
贴一段测试代码
void Update()
{
var start = DateTime.Now;
for (int i = 0; i < this.inputData.Length; i++)
{
this.inputData[i] = -125;
var a = Mathf.Abs(this.inputData[i]);
a = Mathf.Clamp(a, 0, 1023);
this.inputData[i] = (short)(a * 255 / 1023);
}
Debug.Log($"<color=#ff00ff>CPU cost : {(DateTime.Now - start).TotalMilliseconds}</color>");
start = DateTime.Now;
**byte[] outData = new byte[size];**
this.ComputeData(ref outData); //GPU
int[] outData2 = new int[this.size];
Array.Copy(outData, 0, outData2, 0, outData.Length);
Debug.Log($"<color=#ffff00>GPU cost : {(DateTime.Now - start).TotalMilliseconds}</color>");
}
private void ComputeData(ref int[] outPutBytes)
{
//if (this.inputbuffer == null)
{
inputbuffer = new ComputeBuffer(this.inputData.Length, 4); //定义缓冲区(参数:数组长度、每个数组元素占用字节数)
}
//if (this.outputbuffer == null)
{
outputbuffer = new ComputeBuffer(this.outputData.Length, 4);
}
inputbuffer.SetData(this.inputData); //待计算数据加载入缓冲区
this.shader.SetBuffer(this.k, "inputData", inputbuffer); //定义输入口
this.shader.SetBuffer(this.k, "outputData", outputbuffer); //定义输出口
this.shader.Dispatch(this.k, this.inputData.Length / 1024, 1, 1); //开始执行(参数:主函数下标、线程组的XYZ个数)
outputbuffer.GetData(this.outputData); //缓冲区获得计算好的数据
for (int i = 0; i < this.outputData.Length; i++)
{
outPutBytes[i] = (byte)this.outputData[i];
}
inputbuffer.Dispose(); //清除缓存
outputbuffer.Dispose();
}
运行情况
GC
恐怖如斯啊~~~