查看: 1402|回复: 1

关于《最长的一帧》中节点删除的疑惑

[复制链接]

该用户从未签到

发表于 2013-12-11 22:14:48 | 显示全部楼层 |阅读模式
王锐老师,

    您好,本人结合实践遇到的问题,查阅您写的《最长的一帧》,其中在第十二日讲解中,您分别介绍了DatabasePager中的4个列表,分别负责对象弃用、数据请求、等待编译和等待合并。在本节的最后您提到通过updateBlock函数放行DatabasePager线程,之后取出_childrenToDeleteList中的所有对象,并安全的将它们析构。
    我的问题是取出_childrenToDeleteList中的所有对象后,如何将它们安全的析构呢?我查看了run()函数,在do...while()循环中新建了一个局部静态变量(ObjectList deleteList),然后通过swap()函数将_childrenToDeleteList中的对象转给了deleteList。您所说的将对象析构是否就是通过do...while()循环结束时deleteList的生命周期终止,自动析构其中对象?我有以下几个问题:

    1)deleteList是否是等待一次循环结束时自动删除节点对象?如果是的话,是否会引起暂时的内存周转不开状况,因为一次循环中后边还会通过readnode读取新的节点以及节点挂载数据,而此时deleteList中的数据还未删除。我如果在swap()之后直接通过deleteList.clear()清空列表是否可以实现第一时间清楚数据?我担心列表中存储的是地址,是否会引起内存泄露?
    2)我加载影像瓦片数据,当视口下边数据达到很大时,当我delete掉根节点后,数据可以很快被析构,内存会被释放;但是加载模型数据后,同样的操作下内存不会析构很多,感觉像内存泄露了。但是每个模型节点都是会用的pagelod的指针挂在父节点下,难道说是关联的纹理没有被析构吗?模型是ive的,纹理是dds的。这个还请老师帮忙分析一下。

该用户从未签到

发表于 2013-12-13 10:00:10 | 显示全部楼层
_childrenToDeleteList是ref_ptr的列表,因此它被清空的时候,如果引用计数归0那么也会立即释放对应的对象,这种机制不会产生内存泄露,大可放心
至于您说的第二个问题,我只能猜测是您自己的某些处理方法或者测试方法有问题。plod是不会有内存泄露的情况的,这已经被无数人和无数项目证明过了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表