如何从字节流中获得Vector3数组?



我的问题相当直接:将包含连续浮点数的字节流byte[] data转换为表示网格Vector3[] vertices顶点的向量数组。

以下是目前为止我的方法(这里只显示了相关的代码):
public void SetReconstructedMeshFromDataStream(byte[] data)
{
int vertexBufferSize = BitConverter.ToInt32(data, 0);
Mesh mesh = new Mesh();
// 12 is the size of Vector3:
mesh.vertices = new Vector3[vertexBufferSize / 12];  
// srcOffset = 12, because that is the size of the header in the data buffer:
Buffer.BlockCopy(data, 12, mesh.vertices, 0, vertexBufferSize); 
}

失败了,因为Buffer.BlockCopy()只适用于基本类型。当然,我们可以只是复制到float[],但如何从float[]转换到Vector3[]没有一个循环?

基本上我想避免在我的网格(和法线,三角形,…)的所有顶点的循环,因为我已经有正确排序的数据在我的字节流。我只是想创建具有正确大小的对象并复制(或引用)数据。

编辑:找到了一个类似问题的答案:这是几年前的。这仍然是我问题的最佳答案吗?使用不安全代码有什么注意事项吗?

曾经做过类似的事情,将向量从c++ dll转移到向量数组。我不记得确切的代码,但它涉及到Unity Collections包。它提供了一系列原生数据类型,包括具有Reinterpret方法的NativeArray,该方法直接允许将类型重新解释为另一种类型。在我的例子中,我已经有了一系列浮点数,但它也可以直接从字节中工作。

也就是说,你能控制生成字节流的代码吗?因为如果你正在编写自己的本地插件,可以获得网格顶点的句柄,并直接在DLL端操作这些顶点,这可能会更快一点。Unity的官方原生渲染插件github演示了这一点。

最新更新