在我的游戏中,我有一个资源管理器的概念,它是一个存储和管理资源(字体,纹理,网格等)的类。大致来说它下面的方法:高效安全的资源管理
struct ResourceManager
{
template<class T>
std::shared_ptr<T> GetResource(id_type id) const
{
auto pRes = std::dynamic_pointer_cast<T,Resource>(getResource(id));
return pRes;
}
}
void load(); //loads resources from some storage
//etc.
};
后来,资源被一些游戏对象,等后天所以,很显然,资源必须被包裹成的shared_ptr。但是关于资源的内部数据呢?它是否也被包装到shared_ptr中?
例如,网格资源:
struct MeshResource : public Resource
{
std::vector<vertex>* vertices;
std::vector<unsigned int>* indexes;
};
应裹成的std :: shared_ptr的顶点和索引?如果是的话 - 是否有任何替代(成语,或模式,任何东西)shared_ptr?这是非常大的开销,我想避免在资源子类中使用shared_ptr。从另一方面,我想以某种方式保护数据。例如,以下代码必须启动编译错误。
delete pMeshResource->vertices;
任何想法?
,我已经想出了解决办法:
struct MeshResource : public Resource
{
const std::vector<unsigned int>& indexes() const;
const std::vector<vertex>& get_vertices() const;
private:
std::vector<vertex> vertices;
std::vector<unsigned int> indexes;
};
MeshResource是恒定的(资产)的资源。修改它是不可能的,但你可以随时读取它。
为什么要将顶点和索引作为指针而不是按值? – pmr 2012-04-07 10:53:13
,因为每次我想获取一些资源时,复制效率极低。 – innochenti 2012-04-07 10:54:50
@inncohenti这就是为什么您的资源已被管理?如果真的有很多不同的网格共享同一组顶点的情况,这是完全正确的,但这取决于您的应用程序。 – pmr 2012-04-07 10:55:59