首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高效安全的资源管理

高效安全的资源管理
EN

Stack Overflow用户
提问于 2012-04-07 10:50:39
回答 1查看 2.1K关注 0票数 0

在我的游戏中,我有一个资源管理器的概念,一个存储和管理资源的类(字体、纹理、网格等等)。大致上,它有以下方法:

代码语言:javascript
复制
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中吗?

例如,网格资源:

代码语言:javascript
复制
struct MeshResource : public Resource
{
std::vector<vertex>* vertices;
std::vector<unsigned int>* indexes;
};

应该将顶点和索引包装到std::shared_ptr中吗?如果是的话--除了shared_ptr,还有其他的选择(成语或模式,任何东西)吗?这是非常巨大的开销,我希望避免在Resource子类中使用shared_ptr。另一方面,我想以某种方式保护数据。例如,下面的代码必须启动编译错误。

代码语言:javascript
复制
delete pMeshResource->vertices;

有什么想法吗?

--我想出的解决方案:

代码语言:javascript
复制
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是常量(资产)资源。修改它是不可能的,但是你总是可以从它中读出来。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-07 10:53:41

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

如果两个网格有相同的顶点,其中一个被一些变形所修正,那么应该发生什么?另一个也会使用变形的顶点,还是你会在修改一个网格的时候,实现对每个网格的复制--它是独立的顶点集?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10053825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档