C# 在文件中保存点云数组的最佳方法
我正在使用Kinect V2进行体积记录。我正在使用C中的Kinect sdk版本2。 我想保存一个包含多个点云框架的文件。我将导入Unity中的文件,并将帧作为点云动画播放。我以前在Unity内部做过这项工作,但这次我使用VisualStudio来访问SDK中的所有方法 该文件应包含: 点的顶点数组 颜色数组每个点的颜色 最终应该可以添加: 三角形阵列 用户关节我目前正在使用它来记录人类 在我的第一次尝试中,我编写了一个非常简单的UserFrame类,其中包含一个顶点列表。然后我序列化了一个用户框架列表,我可以成功地在Unity中导入它。然而,在Unity中反序列化它需要花费大约一分钟的时间来录制几秒钟,所以我想知道是否有更好的方法 我应该编写和解析ASCII文件吗? 在上一次尝试中,我的顶点是数组而不是列表。这会提高反序列化的速度吗? 这是该类的编辑版本:C# 在文件中保存点云数组的最佳方法,c#,unity3d,kinect-sdk,point-clouds,kinect-v2,C#,Unity3d,Kinect Sdk,Point Clouds,Kinect V2,我正在使用Kinect V2进行体积记录。我正在使用C中的Kinect sdk版本2。 我想保存一个包含多个点云框架的文件。我将导入Unity中的文件,并将帧作为点云动画播放。我以前在Unity内部做过这项工作,但这次我使用VisualStudio来访问SDK中的所有方法 该文件应包含: 点的顶点数组 颜色数组每个点的颜色 最终应该可以添加: 三角形阵列 用户关节我目前正在使用它来记录人类 在我的第一次尝试中,我编写了一个非常简单的UserFrame类,其中包含一个顶点列表。然后我序列化了一个用
public class UserFrame
{
//Frame time-stamp. Could be long int in milliseconds
//public float time;
// Each element in the vertexList contains an array of 3 floats.
public List<float[]> vertexList;
public UserFrame(List<float[]> _vertexList) {
vertexList = _vertexList;
}
}
反序列化这是缓慢的部分:
Stream stream = File.Open (fileName, FileMode.Open);
BinaryFormatter bf = new BinaryFormatter ();
dummyFrames = (List <UserFrame>)bf.Deserialize (stream);
stream.Close ();
使用自定义序列化程序而不是BinaryFormatter将使数据更小,反序列化速度更快。这需要更多的代码,因为你需要知道确切的顺序,但在你的情况下,这是值得的 请参见此基准:
因此,您必须实现一个方法,该方法迭代整个数组,并将每个浮点数彼此相邻放置。然后在另一方面,通过执行相反的操作进行反序列化。这意味着您需要添加一个额外的信息,即数组的长度,以便知道要为特定集合收集多少值。我尝试了两种保存数据的方法 第一种方法 大小为3xN的二维浮点数组,其中N是顶点数。 大小为4xN的字节的二维数组,其中四个分量中的每一个都表示颜色的R、G、B和A分量。 这是非常缓慢的 第二种方法我决定试一试。但是,protbuf不适用于二维数组,因此我必须将数据转换为一维数组:
public float[] vertexX;
public float[] vertexY;
public float[] vertexZ;
public float [] r;
public float [] g;
public float [] b;
public float [] a;
事实证明,改变这种数据结构极大地提高了反序列化的速度,即使使用BinaryFormatter方法也是如此。因此,我结束了使用它。您需要显示当前用于保存它的代码,这很慢。你这样做的原因是为了让人们写下答案,而这恰恰是不适合你的。编辑您的问题并添加代码谢谢。刚刚编辑了问题。找不到任何问题。我想你的数据太大了。考虑使用原Buffnet网络。速度非常快。
public float[] vertexX;
public float[] vertexY;
public float[] vertexZ;
public float [] r;
public float [] g;
public float [] b;
public float [] a;