高效、安全的资源管理
efficient and safe resource management
在我的游戏中,我有一个资源管理器的概念,一个存储和管理资源(字体、纹理、网格等)的类
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,还有其他选择(习惯用法或模式等)吗?这是非常巨大的开销,我希望避免在Resource子类中使用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是常量(资产)资源。修改它是不可能的,但你总是可以从中读取。
只保留堆中真正需要共享的东西。其他的都应该在堆栈上。困难的决定是什么要共享,什么不共享,这在很大程度上取决于实际用例。
如果两个网格共享这些顶点,而其中一个网格被一些变形修改,会发生什么?另一个也会使用变形的顶点吗?还是在修改一个网格时实现写时复制,为每个网格提供一组单独的顶点?
相关文章:
- 如何维护资源管理器项目视图中当前可见的项目列表
- 资源管理设计模式
- 编译器资源管理器和 GCC 具有不同的输出
- Windows 资源管理器中的图标在使用 resource.rc 时显示 2 个不同的图标
- 编译器资源管理器(godbolt)如何安全地运行代码?
- 从 GUI 文件资源管理器执行程序,并且不生成终端
- 强制资源管理器重新加载注册表值
- Visual Studio 测试资源管理器找不到我的提升测试
- 通过文件资源管理器获取文件夹目录
- Windows 资源管理器打开文件夹还原
- 如何使用C 浏览目录以创建文件资源管理器
- C++ Android 资源管理器从应用内部目录中读取文件
- 停止SetVolumeMountPoint打开文件资源管理器
- 重新启动资源管理器.exe使用 C++
- 关于多态性和资源管理的程序设计
- 资源管理器
- Visual Studio,在(解决方案资源管理器的)某个筛选器内的所有文件中查找/替换文本
- SHOpenFolder并选择资源管理器更换程序的项目
- 如何在 Windows 资源管理器中捕获用户的左键单击?
- 高效、安全的资源管理