高效安全的资源管理

时间:2012-04-07 10:50:40

标签: c++ architecture resources

在我的游戏中,我有一个资源管理器的概念,一个存储和管理资源(字体,纹理,网格等)的类。非常粗略地说它有以下方法:

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中?

例如,Mesh资源:

struct MeshResource : public Resource
{
std::vector<vertex>* vertices;
std::vector<unsigned int>* indexes;
};

应该将顶点和索引包装到std :: shared_ptr中吗?如果是 - 是否有任何替代方法(成语,模式,任何东西)到shared_ptr?这是非常巨大的开销,我想避免在Resource子类中使用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是常量(资产)资源。修改它是不可能的,但你可以随时阅读它。

1 个答案:

答案 0 :(得分:1)

只保留真正需要在堆上共享的内容。其他一切都应该在堆栈上。困难的决定是分享什么,什么不分,这也取决于实际用例。

如果两个网格共享顶点而一个网格被一些变形修改,会发生什么?另一个是否也会使用变形顶点或者你是否实现了copy-on-write以便在每个网格被修改后立即为它们提供单独的顶点集?