From 6af4933b5279fc4371e4d30886b3d020214d27d5 Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Sun, 29 Jan 2023 18:51:31 +0800 Subject: [PATCH] Fixed on-close crashes coming from SHResourceManager --- .../src/Application/SBApplication.cpp | 6 ++++++ .../src/Graphics/MiddleEnd/Batching/SHBatch.cpp | 4 ++++ SHADE_Engine/src/Resource/SHResourceLibrary.h | 6 ++++-- SHADE_Engine/src/Resource/SHResourceManager.cpp | 11 ++++++++++- SHADE_Engine/src/Resource/SHResourceManager.h | 9 ++++++++- SHADE_Engine/src/Resource/SHResourceManager.hpp | 17 +++++++++++------ 6 files changed, 43 insertions(+), 10 deletions(-) diff --git a/SHADE_Application/src/Application/SBApplication.cpp b/SHADE_Application/src/Application/SBApplication.cpp index 233ca4ed..e63754a7 100644 --- a/SHADE_Application/src/Application/SBApplication.cpp +++ b/SHADE_Application/src/Application/SBApplication.cpp @@ -239,7 +239,13 @@ namespace Sandbox SDL_Quit(); #endif + // Unload scenes SHSceneManager::Exit(); + + // Free all remaining resources + SHResourceManager::UnloadAll(); + + // Shut down engine SHSystemManager::Exit(); SHAssetManager::Exit(); } diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHBatch.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHBatch.cpp index 685511fe..8332f170 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHBatch.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHBatch.cpp @@ -424,6 +424,10 @@ namespace SHADE const auto& MATRICES = animator->GetBoneMatrices(); boneMatrixData.insert(boneMatrixData.end(), MATRICES.cbegin(), MATRICES.cend()); } + else + { + // TODO: Populate with empty matrices + } // We don't have to account for missing animators or reset indices as the renderable list are not updated at this point } diff --git a/SHADE_Engine/src/Resource/SHResourceLibrary.h b/SHADE_Engine/src/Resource/SHResourceLibrary.h index a6f772fe..1ff037bc 100644 --- a/SHADE_Engine/src/Resource/SHResourceLibrary.h +++ b/SHADE_Engine/src/Resource/SHResourceLibrary.h @@ -176,12 +176,14 @@ namespace SHADE /* Type Definition */ /*-----------------------------------------------------------------------------*/ using LibraryDeleter = std::function; + using LibraryClearer = std::function; /*-----------------------------------------------------------------------------*/ /* Data Members */ /*-----------------------------------------------------------------------------*/ - std::unordered_map resourceLibs; // TODO: Replace with compile time map - std::vector deleters; + std::unordered_map resourceLibs; // TODO: Replace with compile time map + std::vector deleters; + std::unordered_map clearers; /*-----------------------------------------------------------------------------*/ /* Helper Functions */ diff --git a/SHADE_Engine/src/Resource/SHResourceManager.cpp b/SHADE_Engine/src/Resource/SHResourceManager.cpp index 5a99cad1..9ddb8814 100644 --- a/SHADE_Engine/src/Resource/SHResourceManager.cpp +++ b/SHADE_Engine/src/Resource/SHResourceManager.cpp @@ -23,7 +23,8 @@ namespace SHADE SHResourceLibrary SHResourceManager::rigNodeStore; std::unordered_map>> SHResourceManager::handlesMap; std::unordered_map SHResourceManager::assetIdMap; - std::unordered_map> SHResourceManager::typedFreeFuncMap; + std::unordered_map SHResourceManager::typedFreeFuncMap; + std::unordered_map SHResourceManager::typedFreeAllFuncMap; std::vector SHResourceManager::loadedAssetData; bool SHResourceManager::textureChanged = false; bool SHResourceManager::meshChanged = false; @@ -92,6 +93,14 @@ namespace SHADE loadedAssetData.clear(); } + void SHResourceManager::UnloadAll() + { + for (auto func : typedFreeAllFuncMap) + { + func.second(); + } + } + /*-----------------------------------------------------------------------------------*/ /* Query Functions */ /*-----------------------------------------------------------------------------------*/ diff --git a/SHADE_Engine/src/Resource/SHResourceManager.h b/SHADE_Engine/src/Resource/SHResourceManager.h index 837c0195..4188bde9 100644 --- a/SHADE_Engine/src/Resource/SHResourceManager.h +++ b/SHADE_Engine/src/Resource/SHResourceManager.h @@ -111,6 +111,10 @@ namespace SHADE /// Needs to be called to finalise all changes to loads, unless at runtime. /// static void FinaliseChanges(); + /// + /// Unloads all loaded resources. + /// + static void UnloadAll(); /*---------------------------------------------------------------------------------*/ /* Query Functions */ @@ -172,6 +176,8 @@ namespace SHADE using HandleAssetMap = std::unordered_map, AssetID>; using AssetHandleMapRef = std::reference_wrapper; using HandleAssetMapRef = std::reference_wrapper; + using AssetFreeFunc = std::function; + using LibraryClearer = std::function; /*---------------------------------------------------------------------------------*/ /* Data Members */ @@ -181,7 +187,8 @@ namespace SHADE static SHResourceLibrary rigNodeStore; static std::unordered_map handlesMap; static std::unordered_map assetIdMap; - static std::unordered_map> typedFreeFuncMap; + static std::unordered_map typedFreeFuncMap; + static std::unordered_map typedFreeAllFuncMap; // Pointers to temp CPU resources static std::vector loadedAssetData; // Dirty Flags diff --git a/SHADE_Engine/src/Resource/SHResourceManager.hpp b/SHADE_Engine/src/Resource/SHResourceManager.hpp index ea0d75a4..baf915e0 100644 --- a/SHADE_Engine/src/Resource/SHResourceManager.hpp +++ b/SHADE_Engine/src/Resource/SHResourceManager.hpp @@ -177,14 +177,19 @@ namespace SHADE { handlesMap.emplace(TYPE, AssetHandleMap{}); assetIdMap.emplace(TYPE, HandleAssetMap{}); - typedFreeFuncMap.emplace - ( - TYPE, - [TYPE](AssetID assetId) + typedFreeFuncMap[TYPE] = [TYPE](AssetID assetId) + { + static_cast>(SHResourceManager::handlesMap[TYPE][assetId]).Free(); + }; + typedFreeAllFuncMap[TYPE] = [TYPE]() + { + auto& handlesMap = SHResourceManager::handlesMap[TYPE]; + for (auto handle : handlesMap) { - static_cast>(SHResourceManager::handlesMap[TYPE][assetId]).Free(); + static_cast>(handle.second).Free(); } - ); + handlesMap.clear(); + }; } return std::make_pair(std::ref(handlesMap[TYPE]), std::ref(assetIdMap[TYPE])); }