示例#1
0
        public static void OpenAndConvertAssimpFiles()
        {
            var files = GetInputFiles()
                        .Where(AssimpLoader.CanLoad)
                        .Select(f => new FileLoadData(f))
                        .ToArray();

            // Load all the files
            foreach (var f in files)
            {
                try
                {
                    (f.MemoryConsumption, f.MSecToOpen) =
                        Util.GetMemoryConsumptionAndMSecElapsed(() =>
                                                                f.Scene = AssimpLoader.Load(f.SourceFile.FullName));
                }
                catch (Exception e)
                {
                    f.Error = e;
                }
            }

            // Convert all the Assimp scenes to G3D
            foreach (var f in files)
            {
                if (f.Scene == null)
                {
                    continue;
                }

                try
                {
                    f.MSecToConvert = Util.GetMSecElapsed(() =>
                                                          f.G3d = f.Scene.ToG3d());
                }
                catch (Exception e)
                {
                    f.Error = e;
                }
            }

            // Save all the G3D scenes
            Util.CreateAndClearDirectory(TestOutputFolder);
            foreach (var f in files)
            {
                if (f.G3d == null)
                {
                    continue;
                }

                try
                {
                    var outputFilePath = Path.Combine(TestOutputFolder, f.ShortName + ".g3d");
                    f.G3DFile = new FileInfo(outputFilePath);

                    f.MSecToSaveG3d = Util.GetMSecElapsed(() =>
                                                          f.G3d.Write(outputFilePath));
                }
                catch (Exception e)
                {
                    f.Error = e;
                }
            }

            // Try reading back in all of the G3D scenes, measure load times and the memory consumption
            foreach (var f in files)
            {
                if (f.G3DFile == null)
                {
                    continue;
                }

                try
                {
                    G3D localG3d = null;

                    (f.MemoryConsumptionG3d, f.MSecToOpenG3d) =
                        Util.GetMemoryConsumptionAndMSecElapsed(() =>
                                                                localG3d = G3D.Read(f.G3DFile.FullName));

                    ValidateSameG3D(f.G3d, localG3d);
                }
                catch (Exception e)
                {
                    f.Error = e;
                }
            }

            // Output the header for data
            Console.WriteLine(
                "Importer," +
                "Extension," +
                "File Name," +
                "File Size(KB)," +
                "Load Time(s)," +
                "Memory(KB)," +
                "# Meshes," +
                "Time to Convert," +
                "Time to Write G3D," +
                "G3D File Size(KB)," +
                "G3D Memory(KB)",
                "G3D Load Time(s)",
                "Error");

            // Output the data rows
            foreach (var f in files)
            {
                Console.WriteLine(
                    "Assimp," +
                    $"{Path.GetExtension(f.ShortName)}," +
                    $"{f.ShortName}," +
                    $"{f.SourceFile?.Length / 1000}," +
                    $"{f.MSecToOpen / 100f}," +
                    $"{f.MemoryConsumption / 1000}," +
                    $"{f.NumMeshes}," +
                    $"{f.MSecToConvert / 100f}," +
                    $"{f.MSecToSaveG3d / 100f}," +
                    $"{f.G3DFile?.Length / 1000}," +
                    $"{f.MemoryConsumptionG3d / 1000}," +
                    $"{f.MSecToOpenG3d / 100f}," +
                    $"{f.Error}");
            }

            Assert.AreEqual(0, files.Count(f => f.Error != null), "Errors occurred");
        }