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

后来,资源被一些游戏对象等获取。所以,很明显,Resource 必须被包裹到 shared_ptr 中。但是 Resource 的内部数据呢?它是否也应该被包装到 shared_ptr 中?

例如,Mesh 资源:

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 是常量(资产)资源。无法修改它,但您始终可以从中读取。

4

1 回答 1

1

只保留真正需要在堆上共享的东西。其他所有内容都应该在堆栈上。困难的决定是要共享什么,不共享什么,这也很大程度上取决于实际用例。

如果两个网格共享顶点并且一个被一些变形修改,会发生什么?另一个是否也会使用变形的顶点,或者您是否实施写入时复制,以便在修改一个网格时立即为每个网格提供单独的一组顶点?

于 2012-04-07T10:53:41.693 回答