diff --git a/modules/asset_loader/src/vkcv/asset/asset_loader.cpp b/modules/asset_loader/src/vkcv/asset/asset_loader.cpp
index d8f2563d867e5521bce29a3880650f0418ad9db8..ef83785e6a7280dc7e6e45a850915f2ad4fc56c1 100644
--- a/modules/asset_loader/src/vkcv/asset/asset_loader.cpp
+++ b/modules/asset_loader/src/vkcv/asset/asset_loader.cpp
@@ -825,6 +825,7 @@ namespace vkcv::asset {
 	
 	int loadScene(const std::filesystem::path &path, Scene &scene) {
 		int result = probeScene(path, scene);
+		size_t i;
 		
 		if (result != ASSET_SUCCESS) {
 			vkcv_log(LogLevel::ERROR, "Loading scene failed '%s'",
@@ -832,7 +833,13 @@ namespace vkcv::asset {
 			return result;
 		}
 		
-		for (size_t i = 0; i < scene.meshes.size(); i++) {
+		/* Preloading the textures of the scene to improve performance */
+		#pragma omp parallel for shared(scene.textures) private(i)
+		for (i = 0; i < scene.textures.size(); i++) {
+			loadTextureData(scene.textures[i]);
+		}
+		
+		for (i = 0; i < scene.meshes.size(); i++) {
 			result = loadMesh(scene, static_cast<int>(i));
 			
 			if (result != ASSET_SUCCESS) {
@@ -849,6 +856,7 @@ namespace vkcv::asset {
 		Texture texture;
 		texture.path = path;
 		texture.sampler = -1;
+		
 		if (loadTextureData(texture) != ASSET_SUCCESS) {
 			texture.path.clear();
 			texture.w = texture.h = texture.channels = 0;
diff --git a/modules/shader_compiler/src/vkcv/shader/Compiler.cpp b/modules/shader_compiler/src/vkcv/shader/Compiler.cpp
index 1467bf22616764e00399ada69d5f866b929416d5..dcf9e5167c2b2fdd251e4e245a8ea7a6d7e62712 100644
--- a/modules/shader_compiler/src/vkcv/shader/Compiler.cpp
+++ b/modules/shader_compiler/src/vkcv/shader/Compiler.cpp
@@ -7,11 +7,24 @@ namespace vkcv::shader {
 								  const std::unordered_map<ShaderStage, const std::filesystem::path>& stages,
 								  const ShaderProgramCompiledFunction& compiled,
 								  const std::filesystem::path& includePath, bool update) {
+		std::vector<std::pair<ShaderStage, const std::filesystem::path>> stageList;
+		size_t i;
+		
+		stageList.reserve(stages.size());
 		for (const auto& stage : stages) {
+			stageList.push_back(stage);
+		}
+		
+		/* Compile a shader programs stages in parallel to improve performance */
+		#pragma omp parallel for shared(stageList, includePath, update) private(i)
+		for (i = 0; i < stageList.size(); i++) {
+			const auto& stage = stageList[i];
+			
 			compile(
 				stage.first,
 				stage.second,
 				[&program](ShaderStage shaderStage, const std::filesystem::path& path) {
+					#pragma omp critical
 					program.addShader(shaderStage, path);
 				},
 				includePath,