Unity - 使用 GetRawTextureData 更改底层 RGB 字节而无需复制



我正在尝试将OpenCV与Unity一起使用进行图像处理,并且我正在尝试使OpenCV和Unity代码之间的数据传输尽可能高效。

目前,我能够在 C# 中创建一个新byte[],然后在 OpenCV 中将图像加载到这些字节中,然后使用texture.LoadRawTextureData(array)texture.Apply()在 Unity 中显示此纹理。

但是,Unity 文档建议使用texture.GetRawTextureData()来获取对 NativeArray 的引用(返回byte[]创建原始数据副本的函数版本),然后将数据直接写入此缓冲区(+调用Apply())。

不幸的是,关于 NativeArrays 的文档相当稀缺 - NativeArrays 在内存中究竟是什么样子的?它们确实具有ToArray()功能,但这再次复制了数据。我需要的是一个 byte[] 数组,它可以是 RGB24 或 RGBA32(RGBA 似乎是首选,因为即使纹理不透明,内存效率低下,现代 GPU 显然不支持 RGB24)。

有没有办法在不复制和调用LoadRawTextureData()的情况下将指针传递到纹理中缓冲区的开头?还是纹理中的数据采用完全不同的格式?

我对NativeArray也有同样的困惑。看起来 CopyTo() 方法似乎没有分配内存。有一个ToArray()方法,我确信可以分配。

我能够找出这个实用程序方法,该方法适用于网络摄像头提要。

private byte[] m_byteCache = null;
public byte[] GetRawTextureData(Texture2D texture)
{
NativeArray<byte> nativeByteArray = texture.GetRawTextureData<byte>();
if (m_byteCache?.Length != nativeByteArray.Length)
{
m_byteCache = new byte[nativeByteArray.Length];
}
nativeByteArray.CopyTo(m_byteCache);
return m_byteCache;
}

ToArray() 分配一个新数组。CopyTo() 不分配内存,但当然它会复制数据。

但是我从文档中收集到的是,您应该能够像普通数组一样访问 NativeArray 来修改内存,然后调用 .在相应的纹理对象上应用()。如果你能让你的C# OpenCV代码写入它,那应该可以解决问题。 NativeArray 的问题是,我猜你直接获得运行代码的任何实现的内存,所以确切的字节表示形式可能会因平台而异。此外,一旦纹理消失,内存将无效。

最新更新