Unity:GetPixels32()和GetPixels32(colors)之间的差异

问题描述 投票:1回答:1

我正在使用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();时,我正在从摄像机中得到黑屏。

  1. 两个功能之间有区别吗?

  2. 如果我想从Color32[]中获取Texture2D怎么办? (Texture2D具有2个获得Color32[]的功能:GetPixels32()GetRawTextureData<Color32>().ToArray(),都给了我黑色 屏幕)

unity3d texture2d
1个回答
0
投票

关于您的标题

GetPixels32()与GetPixels32(颜色)之间的差异

如果您查看API,您会发现方法签名为

public Color32[] GetPixels32(Color32[] colors = null);

所以colorsoptional 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引用,该引用仍是从未写入的空数组。

© www.soinside.com 2019 - 2024. All rights reserved.