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

Posted

技术标签:

【中文标题】如何从字节流中获取 Vector3 数组?【英文标题】:How to get a array of Vector3 from a byte stream? 【发布时间】:2021-09-27 12:29:32 【问题描述】:

我的问题很直接:将包含连续浮点数的字节流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[]

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

编辑:Found this answer to a similar question: 这是几年前的事了。它仍然是我问题的最佳答案吗?使用不安全代码有什么注意事项?

【问题讨论】:

float[] to Vector3[] without a loop 我不认为你可以,因为我们真的不知道 Unity 是如何将这些值存储在内存中的 您可能想查看new Mesh API using Unity's JobSystem,虽然.. JobSystem 使用NativeArray,您可以在它们上使用Reinterpret<T> 在集合类型之间进行转换 @derHugo 感谢您的建议,下面的答案也将我带到了 NativeArrays! :) 【参考方案1】:

曾经做过非常相似的事情,将向量从 C++ dll 传输到向量数组。我不记得确切的代码,但它涉及 Unity Collections 包。它提供了一系列本机数据类型,包括具有 Reinterpret 方法的 NativeArray,该方法直接允许将类型重新解释为另一种类型。 就我而言,我已经有一系列浮点数,但它也可以直接从字节工作。

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

【讨论】:

您好,谢谢。对于您的第一部分,您的意思是这个函数:docs.unity3d.com/ScriptReference/…?关于 2:是的,我可以控制该代码,但它是一个不同的 C++ 项目,在单独的机器上运行(Unity/C# 代码在移动设备上运行 - 这是用于 AR 应用程序) 是的,就是那个。这个似乎已经内置到 Unity 中了。所以你甚至可能不需要我提到的额外的收藏包:docs.unity3d.com/Packages/com.unity.collections@0.0/manual/… 好的,我会测试它是否适用于我的用例并报告回来。谢谢!

以上是关于如何从字节流中获取 Vector3 数组?的主要内容,如果未能解决你的问题,请参考以下文章

php如何将图片转成字节流

转换流

io 字节流字符流

java对象深度拷贝

ajax如何异步向后台获取字节流数据

java之IO输出字节流相关操作