From fa887161f1fd16289b1b6e7c8406237c963133bd Mon Sep 17 00:00:00 2001
From: Tobias Frisch <tfrisch@uni-koblenz.de>
Date: Wed, 27 Apr 2022 00:17:08 +0200
Subject: [PATCH] Optimized scene loading with std future

Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de>
---
 .../src/vkcv/asset/asset_loader.cpp           | 30 +++++++++++++++----
 1 file changed, 24 insertions(+), 6 deletions(-)

diff --git a/modules/asset_loader/src/vkcv/asset/asset_loader.cpp b/modules/asset_loader/src/vkcv/asset/asset_loader.cpp
index f3f55f65..642fe73d 100644
--- a/modules/asset_loader/src/vkcv/asset/asset_loader.cpp
+++ b/modules/asset_loader/src/vkcv/asset/asset_loader.cpp
@@ -8,7 +8,7 @@
 #include <stb_image.h>
 #include <vkcv/Logger.hpp>
 #include <algorithm>
-
+#include <future>
 
 namespace vkcv::asset {
 
@@ -498,7 +498,11 @@ namespace vkcv::asset {
 			if (path.extension() == ".glb") {
 				sceneObjects = fx::gltf::LoadFromBinary(path.string());
 			} else {
-				sceneObjects = fx::gltf::LoadFromText(path.string());
+				sceneObjects = fx::gltf::LoadFromText(path.string(), {
+					fx::gltf::detail::DefaultMaxBufferCount,
+					fx::gltf::detail::DefaultMaxMemoryAllocation,
+					fx::gltf::detail::DefaultMaxMemoryAllocation * 8,
+				});
 			}
 		} catch (const std::system_error& err) {
 			recurseExceptionPrint(err, path.string());
@@ -756,17 +760,31 @@ namespace vkcv::asset {
 			return result;
 		}
 		
-		for (size_t i = 0; i < scene.meshes.size(); i++) {
-			result = loadMesh(scene, static_cast<int>(i));
+		std::vector<std::future<int>> results;
+		results.reserve(scene.meshes.size());
+		
+		size_t i;
+		for (i = 0; i < scene.meshes.size(); i++) {
+			results.push_back(std::async(std::launch::async, [&scene](int id) {
+				return loadMesh(scene, id);
+			}, static_cast<int>(i)));
+		}
+		
+		for (i = 0; i < results.size(); i++) {
+			result = results[i].get();
 			
 			if (result != ASSET_SUCCESS) {
 				vkcv_log(LogLevel::ERROR, "Loading mesh with index %d failed '%s'",
 						 static_cast<int>(i), path.c_str());
-				return result;
+				break;
 			}
 		}
 		
-		return ASSET_SUCCESS;
+		for (; i < results.size(); i++) {
+			results[i].wait();
+		}
+		
+		return result;
 	}
 	
 	Texture loadTexture(const std::filesystem::path& path) {
-- 
GitLab