C++ 高效和安全的资源管理
在我的游戏中,我有一个资源管理器的概念,一个存储和管理资源(字体、纹理、网格等)的类。大致有以下几种方法:C++ 高效和安全的资源管理,c++,architecture,resources,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 p
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.
};
有什么想法吗
我提出的解决方案:
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;
};
struct-MeshResource:公共资源
{
常量std::向量和索引()常量;
常量std::vector&get_顶点()常量;
私人:
向量顶点;
std::向量索引;
};
网格资源是常量(资产)资源。不可能修改它,但您始终可以从中读取。只保留真正需要在堆上共享的内容。其他一切都应该在堆栈上。困难的决定是什么要共享,什么不共享,这在很大程度上取决于实际用例
如果两个网格共享这些顶点,而其中一个被一些变形修改,会发生什么情况?另一个是否也会使用变形的顶点,或者您是否会实现写入时复制,以便在修改一个网格时为每个网格提供单独的顶点集?为什么将顶点和索引作为指针而不是按值?因为每次我想获取一些资源时进行复制效率极低。@InCohenti这就是您的资源是否已被管理?如果真的有很多情况下不同的网格共享同一组顶点,这完全可以,但这取决于你的应用程序。我甚至不确定你是否需要(昂贵的)共享指针。如果资源管理器实际管理资源,则不需要共享所有权:资源管理器是唯一所有者。只需分发引用。@Kerrek SB不幸的是,在这种情况下,我无法删除长时间未使用的资源。网格顶点可以修改,但资源顶点不能。对于可以用于纹理的简单图像也是如此。甚至是字体对象。@innochenti对不起,应该有什么区别?你所说的资源是指“存储”中的东西,而“网格”顶点是指程序中实际存在的东西吗?把资源看作常量对象。
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;
};