如何从字节流中获取 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 数组?的主要内容,如果未能解决你的问题,请参考以下文章