C# 从一维对象数组快速创建二维数组
我需要将类Frames的以下1D数组转换为2D字节数组(我需要2D字节数组发送到GPU,我不能使用锯齿数组、列表或其他枚举) 现在,我的转换非常缓慢和愚蠢:C# 从一维对象数组快速创建二维数组,c#,.net,C#,.net,我需要将类Frames的以下1D数组转换为2D字节数组(我需要2D字节数组发送到GPU,我不能使用锯齿数组、列表或其他枚举) 现在,我的转换非常缓慢和愚蠢: public byte[,] allBytes() { byte[,] output = new byte[this.frameListSize, this.ySize * this.xSize]; for (int y = 0; y < this.frameListSize; y++) { b
public byte[,] allBytes()
{
byte[,] output = new byte[this.frameListSize, this.ySize * this.xSize];
for (int y = 0; y < this.frameListSize; y++)
{
byte[] bits = this.frameList[y].getBytes();
for (int x = 0; x < this.ySize * this.xSize; x++)
{
output[y, x] = bits[x];
}
}
return output;
}
如果使用.NET Framework 4或更高版本,则可以使用(首次加速)
大约是普通复制速度的20倍。确保bits.Length的值与size2的值相同。否则,您可能会遇到错误是的,我使用的是.net 4.5.2,但我认为CPU的使用正在损害我的视频帧抓取器,而视频帧抓取器正是传输所有这些字节的设备(当我与数据获取并行执行此操作时,会出现缓冲区溢出)。生成的2D字节数组是您引用的MSDN文档中的[211024x1024]:ArgumentException当前数组没有精确的一维。很抱歉,这是我的错。然后你必须使用Block.Copy(在我的答案中更改了),这是一个巨大的改进。谢谢
public Frame[] frameList;
public class Frame
{
public byte[] bits;
public byte[] getBytes()
{
return bits;
}
}
public byte[,] allBytes()
{
int size1 = this.frameListSize;
int size2 = this.ySize * this.xSize;
byte[,] output = new byte[size1, size2];
Parallel.For(0, size1, (y) =>
{
byte[] bits = this.frameList[y].getBytes();
System.Buffer.BlockCopy(bits, 0, output, 0 + size2 * y, bits.Length);
});
return output;
}