Man*_*vis 1 c++ opengl shared-ptr c++11
我正在开发一款游戏(以及我自己的定制引擎).我有很多资产(纹理,骨架动画等),它们被多个模型使用,因此可以多次加载.
起初,我的野心更小,游戏更简单,我可以忍受一点点复制,所以shared_ptr
一旦最后一个实例消失,它就会处理资源清理似乎是一个好主意.随着我的游戏的增长,越来越多的资源被多次加载,所有OpenGL状态的变化都将性能降低到了爬行状态.为了解决这个问题,我决定写一个资产管理器类.
我正在使用a unordered_map
存储文件路径,std::string
而c ++ 11 shared_ptr
指向实际加载的资源.如果文件已经加载,我返回指针,如果没有,我调用相应的Loader
类.干净利落.
不幸的是,我不能对删除说同样的话.指针的一个副本仍保留在unordered_map
.目前,我遍历整个地图并.unique()
每帧执行检查.这些指针结果是唯一的,从地图中删除,破坏最后一个副本并强制析构函数运行并进行清理.
迭代数百或数千个对象并不是最有效的方法.(这不是一个过早的优化,我现在处于优化阶段)是否有可能以某种方式覆盖共享指针功能?例如,以某种方式添加"onLastRemains"事件?也许我应该遍历unordered_map
每一帧的一部分(通过桶)?还有其他方法吗?
我知道,我可以尝试编写自己的引用计数资产实现,但我所有的当前代码都假设资产是共享指针.此外,共享指针非常出色,所以为什么要重新发明轮子呢?
不是将shared_ptr
s 存储在资产管理器中map
(见下文,使用常规地图),而是存储weak_ptr
s.构建新资产时,shared_ptr
使用自定义删除器创建一个自定义删除器,该删除器调用资产管理器中的一个函数,该函数管理器告诉它从该映射中删除该指针.自定义删除器应该在此资产的映射中包含迭代器,并在告知资产管理器从映射中删除它的元素时提供迭代器.weak_ptr
在地图中使用a的原因是,仍然可以给出对该元素的任何后续请求shared_ptr
(因为您可以从中创建一个weak_ptr
)但资产管理器实际上没有资产的所有权,并且自定义删除策略将起作用.
编辑:以上技术下面有人指出只有当你使用的作品std::map
不是std::unordered_map
.我的建议是仍然这样做,并切换到常规地图.
归档时间: |
|
查看次数: |
1255 次 |
最近记录: |