我正在使用Unity开发移动应用程序,在其中打开相机并使用WebcamTexture
从中获取数据。
我从相机获得的数据是Color32[]
。
我将数据存储在内存中,然后从内存中读取:
// Address the variable (data) to a memory location
data = new Color32[width * height];
gcHandle = GCHandle.Alloc(data, GCHandleType.Pinned);
// this didn't work
data = webcamTexture.GetPixels32();
// this worked fine
webcamTexture.GetPixels32(data);
// read data from memory using this
gcHandle.AddrOfPinnedObject()
[当我使用webcamTexture.GetPixels32(data);
时,我能够看到摄像机的图像,而当我使用data = webcamTexture.GetPixels32();
时,我正在从摄像机中得到黑屏。
两个功能之间有区别吗?
如果我想从Color32[]
中获取Texture2D
怎么办? (Texture2D
具有2个获得Color32[]
的功能:GetPixels32()
和 GetRawTextureData<Color32>().ToArray()
,都给了我黑色 屏幕)
关于您的标题
GetPixels32()与GetPixels32(颜色)之间的差异
如果您查看API,您会发现方法签名为
public Color32[] GetPixels32(Color32[] colors = null);
所以colors
是optional parameter。
因此,从较高的角度来看:没有区别,两者都是相同的方法。
但是],如果您阅读
。如果您每帧都使用它,这当然会贵很多。您可以选择传入
。Color32
的数组以用于颜色,以避免每帧分配新的内存,当您不断从相机读取数据时,这样做会更快。需要将数组初始化为与宽度*纹理高度匹配的长度。 如果不传递数组,GetPixels32
将为您分配一个并返回它您会看到传递或不传递数组的区别在于,如果不执行此操作,则每次调用它都会分配一个新数组
除了对性能产生影响之外,还必须记住,这种方式每次都会获得一个新的数组引用。
所以现在说的是,再次查看正在执行的代码
data = new Color32[width * height]; gcHandle = GCHandle.Alloc(data, GCHandleType.Pinned);
因此,如果要填充此数组,它仍然是相同的数组对象
webcamTexture.GetPixels32(data); gcHandle.AddrOfPinnedObject()
所以这可以工作,因为您要填充固定在
gcHandle
中的相同数组引用。
另一方面,这不起作用
。在这个你没有打过data = webcamTexture.GetPixels32(); gcHandle.AddrOfPinnedObject()
因为在这里您创建了新数组引用
gcHandle = GCHandle.Alloc(data, GCHandleType.Pinned);
因此,当您到达
gcHandle.AddrOfPinnedObject()
此
gcHandle
仍引用先前的data
引用,该引用仍是从未写入的空数组。