Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 高效和安全的资源管理_C++_Architecture_Resources - Fatal编程技术网

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;
};