Extra2D/Easy2D/include/easy2d/resource/resource_manager.h

152 lines
5.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <easy2d/core/types.h>
#include <easy2d/graphics/texture.h>
#include <easy2d/graphics/alpha_mask.h>
#include <easy2d/graphics/font.h>
#include <easy2d/audio/sound.h>
#include <string>
#include <vector>
#include <unordered_map>
#include <mutex>
namespace easy2d {
// ============================================================================
// 资源管理器 - 统一管理纹理、字体、音效等资源
// ============================================================================
class ResourceManager {
public:
// ------------------------------------------------------------------------
// 单例访问
// ------------------------------------------------------------------------
static ResourceManager& getInstance();
// ------------------------------------------------------------------------
// 搜索路径管理
// ------------------------------------------------------------------------
/// 添加资源搜索路径
void addSearchPath(const std::string& path);
/// 移除资源搜索路径
void removeSearchPath(const std::string& path);
/// 清空所有搜索路径
void clearSearchPaths();
/// 获取搜索路径列表
const std::vector<std::string>& getSearchPaths() const { return searchPaths_; }
/// 查找资源文件完整路径
std::string findResourcePath(const std::string& filename) const;
// ------------------------------------------------------------------------
// 纹理资源
// ------------------------------------------------------------------------
/// 加载纹理(带缓存)
Ptr<Texture> loadTexture(const std::string& filepath);
/// 加载纹理并生成Alpha遮罩用于不规则形状图片
Ptr<Texture> loadTextureWithAlphaMask(const std::string& filepath);
/// 通过key获取已缓存的纹理
Ptr<Texture> getTexture(const std::string& key) const;
/// 检查纹理是否已缓存
bool hasTexture(const std::string& key) const;
/// 卸载指定纹理
void unloadTexture(const std::string& key);
// ------------------------------------------------------------------------
// Alpha遮罩资源
// ------------------------------------------------------------------------
/// 获取纹理的Alpha遮罩如果已生成
const AlphaMask* getAlphaMask(const std::string& textureKey) const;
/// 为已加载的纹理生成Alpha遮罩
bool generateAlphaMask(const std::string& textureKey);
/// 检查纹理是否有Alpha遮罩
bool hasAlphaMask(const std::string& textureKey) const;
// ------------------------------------------------------------------------
// 字体图集资源
// ------------------------------------------------------------------------
/// 加载字体图集(带缓存)
Ptr<FontAtlas> loadFont(const std::string& filepath, int fontSize, bool useSDF = false);
/// 通过key获取已缓存的字体图集
Ptr<FontAtlas> getFont(const std::string& key) const;
/// 检查字体是否已缓存
bool hasFont(const std::string& key) const;
/// 卸载指定字体
void unloadFont(const std::string& key);
// ------------------------------------------------------------------------
// 音效资源
// ------------------------------------------------------------------------
/// 加载音效(带缓存)
Ptr<Sound> loadSound(const std::string& filepath);
Ptr<Sound> loadSound(const std::string& name, const std::string& filepath);
/// 通过key获取已缓存的音效
Ptr<Sound> getSound(const std::string& key) const;
/// 检查音效是否已缓存
bool hasSound(const std::string& key) const;
/// 卸载指定音效
void unloadSound(const std::string& key);
// ------------------------------------------------------------------------
// 缓存清理
// ------------------------------------------------------------------------
/// 清理所有失效的弱引用(自动清理已释放的资源)
void purgeUnused();
/// 清理指定类型的所有缓存
void clearTextureCache();
void clearFontCache();
void clearSoundCache();
/// 清理所有资源缓存
void clearAllCaches();
/// 获取各类资源的缓存数量
size_t getTextureCacheSize() const;
size_t getFontCacheSize() const;
size_t getSoundCacheSize() const;
ResourceManager();
~ResourceManager();
ResourceManager(const ResourceManager&) = delete;
ResourceManager& operator=(const ResourceManager&) = delete;
// 生成字体缓存key
std::string makeFontKey(const std::string& filepath, int fontSize, bool useSDF) const;
// 互斥锁保护缓存
mutable std::mutex textureMutex_;
mutable std::mutex fontMutex_;
mutable std::mutex soundMutex_;
// 搜索路径
std::vector<std::string> searchPaths_;
// 资源缓存 - 使用弱指针实现自动清理
std::unordered_map<std::string, WeakPtr<Texture>> textureCache_;
std::unordered_map<std::string, WeakPtr<FontAtlas>> fontCache_;
std::unordered_map<std::string, WeakPtr<Sound>> soundCache_;
};
} // namespace easy2d