feat(resources): add LoadGroup and UnloadGroup for batch resource loading
This commit is contained in:
@@ -85,6 +85,23 @@ public:
|
|||||||
|
|
||||||
Containers::String ResolvePath(const Containers::String& relativePath) const;
|
Containers::String ResolvePath(const Containers::String& relativePath) const;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void LoadGroup(const Containers::Array<Containers::String>& paths,
|
||||||
|
std::function<void(ResourceHandle<T>)> callback) {
|
||||||
|
for (const auto& path : paths) {
|
||||||
|
LoadAsync(path, GetResourceType<T>(), [callback](LoadResult result) {
|
||||||
|
if (result && result.resource) {
|
||||||
|
callback(ResourceHandle<T>(static_cast<T*>(result.resource)));
|
||||||
|
} else {
|
||||||
|
callback(ResourceHandle<T>());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Containers::Array<Containers::String> GetResourcePaths() const;
|
||||||
|
void UnloadGroup(const Containers::Array<ResourceGUID>& guids);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ResourceManager() = default;
|
ResourceManager() = default;
|
||||||
~ResourceManager() = default;
|
~ResourceManager() = default;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#include "IResourceLoader.h"
|
#include "IResourceLoader.h"
|
||||||
#include "ResourceCache.h"
|
#include "ResourceCache.h"
|
||||||
#include "AsyncLoader.h"
|
#include "AsyncLoader.h"
|
||||||
|
#include "ResourceDependencyGraph.h"
|
||||||
|
|
||||||
#include "Texture.h"
|
#include "Texture.h"
|
||||||
#include "TextureLoader.h"
|
#include "TextureLoader.h"
|
||||||
@@ -22,6 +23,7 @@
|
|||||||
|
|
||||||
#include "ResourceFileSystem.h"
|
#include "ResourceFileSystem.h"
|
||||||
#include "FileArchive.h"
|
#include "FileArchive.h"
|
||||||
|
#include "ResourcePackage.h"
|
||||||
|
|
||||||
// Forward declarations for concrete resource types
|
// Forward declarations for concrete resource types
|
||||||
namespace XCEngine {
|
namespace XCEngine {
|
||||||
|
|||||||
@@ -186,5 +186,26 @@ void ResourceManager::ReloadResource(ResourceGUID guid) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Containers::Array<Containers::String> ResourceManager::GetResourcePaths() const {
|
||||||
|
Containers::Array<Containers::String> paths;
|
||||||
|
for (const auto& pair : m_guidToPath) {
|
||||||
|
paths.Add(pair.value);
|
||||||
|
}
|
||||||
|
return paths;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ResourceManager::UnloadGroup(const Containers::Array<ResourceGUID>& guids) {
|
||||||
|
std::lock_guard lock(m_mutex);
|
||||||
|
for (const auto& guid : guids) {
|
||||||
|
auto* it = m_resourceCache.Find(guid);
|
||||||
|
if (it != nullptr) {
|
||||||
|
IResource* resource = *it;
|
||||||
|
m_resourceCache.Erase(guid);
|
||||||
|
m_memoryUsage -= resource->GetMemorySize();
|
||||||
|
resource->Release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Resources
|
} // namespace Resources
|
||||||
} // namespace XCEngine
|
} // namespace XCEngine
|
||||||
|
|||||||
Reference in New Issue
Block a user