该实体的主要工作是提供Asset& Load(string path)
多态接口。目前我TextureAsset : Asset
只使用SpriteRenderer
,但会有更多,例如AudioAsset : Asset
。该实体还维护已加载资产的缓存。它目前是一个单身人士,因为我觉得这个类证明了使用通常避免的模式。但是我担心自己可能会过度热心/过于自信,并且当他们说'#34;过度使用模式"等等时,这是完全长老的意思/ p>
它应该是一个静态类而不是析构函数,因为单独的析构函数不会被调用直到应用程序结束?
它是否甚至不是一个类并且是命名空间中的过程函数?
它应该是常规类,是由Engine
对象拥有和提供对象的引用吗?但它与Engine
并不真正相关;理论上你可以让两个Engine
个对象使用相同的AssetManager
(没有实际的理由可以有两个Engine
但我的代码结构并没有禁止它。继续通过这样一个孤儿"也是一种痛苦。周围的物体。
class AssetManager final {
public:
static AssetManager& Instance() {
static AssetManager instance;
return instance;
}
template<typename T>
std::shared_ptr<T> LoadAsset(const std::string& path) {
static_assert(std::is_base_of<Asset, T>::value, "T needs to derive from Asset");
// This assert works, but the error is generated on this line,
// and VS2017 doesn't give any more info.
// Is there a way for me to point to the illegal call instead?
auto search = loaded.find(path);
if (search != loaded.end()) {
std::shared_ptr<Asset> asset = search->second;
return std::dynamic_pointer_cast<T>(asset);
}
std::shared_ptr<T> t_ptr = std::make_shared<T>(path);
loaded.insert(std::pair<std::string, std::shared_ptr<T> >(path, t_ptr));
return t_ptr;
}
void Clear() {
loaded.clear();
}
private:
AssetManager() = default;
~AssetManager() {
loaded.clear();
}
AssetManager(const AssetManager&) = delete;
AssetManager(AssetManager&&) = delete;
AssetManager& operator=(const AssetManager&) = delete;
AssetManager& operator=(const AssetManager&&) = delete;
std::map<std::string, std::shared_ptr<Asset> > loaded;
};