我的问题相当直接:将包含连续浮点数的字节流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演示了这一点。