查看: 2960|回复: 6

内存周转不开的问题

[复制链接]

该用户从未签到

发表于 2013-12-7 13:37:07 | 显示全部楼层 |阅读模式
大家好,我组织了50G的地形数据和5G的模型数据,地形数据是瓦片数据,模型数据设置了两级lod,精细级lod模型带纹理,每个模型纹理4M大小;粗糙模型不带纹理。模型有1000多个,我给精细模型设置的可见范围是0到100米,没有纹理的模型的range是0到5000米,当地形和模型一起加载后,视点贴近地面浏览模型,虽然视口下显示的精细模型始终控制在20个以内,但是浏览过程中内存占用量一直在上升,直到上升到1.5GB左右时,调度线程好像被卡死,场景不再随视点移动绘制了。
开始我怀疑是_targetMaximumNumberOfPageLOD的值太大(默认300),导致缓存节点过多,而单个节点模型将近5M,引起内存过大;后来我把_targetMaximumNumberOfPageLOD干脆设置成了0,依然存在上述问题,我怀疑问题是这样的:缓存不保留暂存节点,只要退出视口范围的节点都删除,但是删除流程比较复杂,又要排序又要按时间戳进行删除,与此同时新的模型进入视口,导致内存总量还是在上升的。本人有以下几个问题:
1、如何可以控制内存的增长?如果上述假设正确,怎样才能控制离开视口的模型被及时删除?
2、1.5GB的内存限制是否有人碰到过?我这里进程所占内存一旦超过大概1.5GB,必会出现不调度的问题。请高手指点。
以下是lod的效果和本人载入模型时的代码,通过osg::pagelod和osg::MatrixTransform节点组织模型数据。代码也可能存在问题,请大家帮忙检查一下
谢谢!

lod效果

lod效果

加载模型.png

该用户从未签到

发表于 2013-12-28 17:44:01 | 显示全部楼层
说明层次细节组织得不够优化,同时加载的模型量过多所致

该用户从未签到

发表于 2014-4-16 21:52:20 | 显示全部楼层
一个模型达到5MB,对于32bit的程序来说,这是不可思议的,你载入不了多少模型。
有三个办法来解决你这个问题哈:
1、模型绝对不能要5MB,哪怕是精模,都不需要这么精细,要不你用3级LOD?
2、Texture在完成预编译之后,将原有的image给删掉,这样可以节省大量内存。这个osg是支持的,你只需要设置开关就可以了。
3、CullSettings里头有一个LODScale参数,默认是1.0。你搞个线程不断监测程序当前占了多少内存,通常超过1G的时候,可以考虑按比例将LODScale设置为小于1的数值,这样一来,在内存不足的时候,LOD的视距会自动的减小,会卸载掉一部分模型,空出一些内存来。

该用户从未签到

发表于 2013-12-26 17:46:06 | 显示全部楼层
我遇到模型不调度的问题,内存在1.4个多g时pagelod加载的模型就不在刷新,模型出现白色和低细节然后不再刷新。我编译的是32位系统。问题一直未解决

该用户从未签到

发表于 2013-12-27 10:53:35 | 显示全部楼层
遇到同样的问题,加载的PageLod模型当内存达到1.5g,场景不再响应任何操作。

该用户从未签到

 楼主| 发表于 2013-12-27 16:13:29 | 显示全部楼层
ysw 发表于 2013-12-27 10:53
遇到同样的问题,加载的PageLod模型当内存达到1.5g,场景不再响应任何操作。

原因还是因为32位程序的问题吧,单个进程超过32位就内存爆掉了,还是控制场景下需要绘制的对象个数,用pagelod可以解决

该用户从未签到

发表于 2013-12-28 09:24:13 | 显示全部楼层
qiulinyao 发表于 2013-12-27 16:13
原因还是因为32位程序的问题吧,单个进程超过32位就内存爆掉了,还是控制场景下需要绘制的对象个数,用pa ...

我现在就是用pageLod 来加载模型数据的,大约有一万多个pageLod模型节点,只要让场景中的模型多现实几个的话,使内存达到1.5g,程序就无响应,如果让场景中的模型个数现实的少,大约1g左右,就没有问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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