查看: 3001|回复: 5

关于OSG的内存释放问题

[复制链接]

该用户从未签到

发表于 2010-8-19 15:53:01 | 显示全部楼层 |阅读模式
我的程序是动态管理场景图的,即,在不同的情况下,往场景图中挂接不同的子节点,同时删除无关的子节点。
在删除子节点的时候,遇到了两个问题:
1、删除一些子节点,我直接使用removeChildren来实现的操作,发现程序的内存消耗量不会立即降下来,只会慢慢的下降,历经大约30秒左右的时间才能下降完成。为什么会这样呢?为什么不会立即释放完成呢?

2、删除一些子节点,内存不会降到初始状态。比如说,在加载这些子节点之前,我的程序的内存消耗量是100MB,子节点加载并挂入场景图之后,程序内存消耗量上升为300MB。然后删除刚刚挂接的子节点,经过大约30秒的漫长等待,内存慢慢下降,但是再也不会下降到100MB左右的位置,而是下降到大约150MB的时候就不会再下降了。这又是为什么呢?内存泄露么?

该用户从未签到

发表于 2010-8-19 23:26:33 | 显示全部楼层
1、如今的OSG内部已经使用一个DeleteHandler来管理即将被释放的对象,因此内存的释放是逐步进行的,这样即可以保证程序运行的平缓,也避免了突然释放导致的崩溃可能。非常有意义

2、DatabasePager绝不是简单地把视野之外的对象立即删除的,而是在内部管理一个PagedLOD的列表,适时删除列表中的数据。现在的OSG内存管理方案是十分稳定的,只要您的使用正确,就决不会有任何内存泄露发生

该用户从未签到

 楼主| 发表于 2010-8-20 14:18:58 | 显示全部楼层
呵呵,问题终于已经解决。

感觉OSG为了提高帧率,的确下了不小的功夫,采用如此复杂的机制来清除内存。不过这个对我来说的确不是一个好事,它清空内存如此之慢,导致我的内存空间周转不过来……

该用户从未签到

发表于 2010-8-20 16:59:34 | 显示全部楼层
Referenced::getDeleteHandler()有一个setNumFramesToRetainObjects()函数,可以设置在多少帧内将所有待删除的对象清空;而flushAll()可以干脆利落地要求所有对象立即清空,您都可以尝试一下

该用户从未签到

发表于 2013-10-29 08:55:26 | 显示全部楼层
yin_savage 发表于 2010-8-20 14:18
呵呵,问题终于已经解决。

感觉OSG为了提高帧率,的确下了不小的功夫,采用如此复杂的机制来清除内存。不 ...

请问楼主问题怎么解决了,需要了解哪些才能解决问题,我现在也遇到这样的问题,本来场景内存是100兆,我有个对象,当需要加载的时候,内存会增加到1g,这个对象如果清空的话,内存应该恢复到100兆,不过,现在这家使用deleteHandel->flushAll出错,不知道你的解决办法是什么

该用户从未签到

发表于 2013-12-7 12:50:02 | 显示全部楼层
yin_savage 发表于 2010-8-20 14:18
呵呵,问题终于已经解决。

感觉OSG为了提高帧率,的确下了不小的功夫,采用如此复杂的机制来清除内存。 ...

请问您是如何解决此问题的?我也出现内存周转不开的情况,是否可以分享一下您的经验?非常感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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