Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在文件中保存点云数组的最佳方法_C#_Unity3d_Kinect Sdk_Point Clouds_Kinect V2 - Fatal编程技术网

C# 在文件中保存点云数组的最佳方法

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类,其中包含一个顶点列表。然后我序列化了一个用

我正在使用Kinect V2进行体积记录。我正在使用C中的Kinect sdk版本2。 我想保存一个包含多个点云框架的文件。我将导入Unity中的文件,并将帧作为点云动画播放。我以前在Unity内部做过这项工作,但这次我使用VisualStudio来访问SDK中的所有方法

该文件应包含:

点的顶点数组 颜色数组每个点的颜色 最终应该可以添加:

三角形阵列 用户关节我目前正在使用它来记录人类 在我的第一次尝试中,我编写了一个非常简单的UserFrame类,其中包含一个顶点列表。然后我序列化了一个用户框架列表,我可以成功地在Unity中导入它。然而,在Unity中反序列化它需要花费大约一分钟的时间来录制几秒钟,所以我想知道是否有更好的方法

我应该编写和解析ASCII文件吗? 在上一次尝试中,我的顶点是数组而不是列表。这会提高反序列化的速度吗? 这是该类的编辑版本:

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;