2012-04-07 53 views
0

在我的游戏中,我有一个资源管理器的概念,它是一个存储和管理资源(字体,纹理,网格等)的类。大致来说它下面的方法:高效安全的资源管理

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是恒定的(资产)的资源。修改它是不可能的,但你可以随时读取它。

+0

为什么要将顶点和索引作为指针而不是按值? – pmr 2012-04-07 10:53:13

+0

,因为每次我想获取一些资源时,复制效率极低。 – innochenti 2012-04-07 10:54:50

+0

@inncohenti这就是为什么您的资源已被管理?如果真的有很多不同的网格共享同一组顶点的情况,这是完全正确的,但这取决于您的应用程序。 – pmr 2012-04-07 10:55:59

回答

1

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

如果两个网格共享顶点,一个网格通过某种变形进行修改,会发生什么?另一个人是否也会使用变形的顶点,或者是否实现了copy-on-write功能,以便在每个网格物体被修改后立即为其分别设置顶点集合?

+0

网格顶点可能会被修改,但资源顶点不是。简单图像也是如此,可以用于纹理。或者甚至是字体对象。 – innochenti 2012-04-07 11:03:15

+0

@innochenti对不起,应该是什么区别?通过资源,你是指“存储”中的事物和“网格”顶点是实际存在于程序中的事物吗? – pmr 2012-04-07 11:06:26

+0

将资源视为常量对象。 – innochenti 2012-04-07 11:06:35