查看: 1176|回复: 3

请各位帮忙解决一下,关于lod

[复制链接]

该用户从未签到

发表于 2015-5-29 14:02:27 | 显示全部楼层 |阅读模式
大家好,我现在有一个建筑模型,大概90m那么大,然后加到地球上,通过以下方式:
osg::ref_ptr<osg::Node> _pIVENode = osgDB::readNodeFile(modelPath);
osg::ref_ptr<osg:agedLOD> _pPagedLod = new osg::PagedLOD;
_pPagedLod->addChild(_pIVENode, dMinVisualDistance, dMaxVisualDistance);
osg::ref_ptr<osg::MatrixTransform> _pIVETrans = new osg::MatrixTransform;
_pIVETrans->setMatrix(matrix);
_pIVETrans->addChild(_pPagedLod);
m_pGroup->addChild(pIVETrans);

若我加入了8、9个模型,我的地球刚打开的时候,就会把这几个模型都加载进去,球的内存就会涨到1G左右,这样会出现两个问题:
1. 当程序内存超出1G时,容易崩溃
2. 通过lod加载的模型,视距的变近变远,内存的释放不会及时也不明显,有时反而增加内存

所以请问各位大神,有什么好的解决办法吗

该用户从未签到

发表于 2015-6-2 17:14:37 | 显示全部楼层
本帖最后由 anlingbin 于 2015-6-2 17:15 编辑

你可以试试这样有没有效果,
namespace
{
        Threading::ReadWriteMutex         _pgmMutex;
        typedef std::map<long, osg:bserver_ptr<osg::Node>> PgcnRegistry;
        PgcnRegistry _pgcnRegistry;
}

struct ReaderWriterPagedModel : public osgDB::ReaderWriter
{
        ReaderWriterPagedModel()
        {
                supportsExtension( "pgm", "osg PagedLOD Child Node Loader" );
        }

        ReadResult readNode(const std::string& uri, const Options* options) const
        {
                if (!acceptsExtension(osgDB::getLowerCaseFileExtension(uri)))
                        return ReadResult::FILE_NOT_HANDLED;

                long id;
                sscanf_s(uri.c_str(), "%d.%*s", &id);

                osg::ref_ptr<osg::Node> node = getNode(id);
                if (node.valid()) {
                        return ReadResult(node.get());
                }
                return ReadResult::ERROR_IN_READING_FILE;
        }
        static std::string makeURI(long uid)
        {
                std::stringstream buf;
                buf << uid << ".pgm";
                return buf.str();
        }
        static long registerNode(osg::Node* node)
        {
                Threading::ScopedWriteLock lock(_pgmMutex);
                long key = (long)node;
                _pgcnRegistry[key] = node;
                //OE_TEST << LC << "Registered FMG " << key << std::endl;
                return key;
        }

        static void unregisterNode(osg::Node* node)
        {
                Threading::ScopedWriteLock lock(_pgmMutex);
                long key = (long)node;
                _pgcnRegistry.erase(key);
                //OE_TEST << LC << "UNregistered FMG " << uid << std::endl;
        }

        static osg::Node* getNode(long id)
        {
                Threading::ScopedReadLock lock(_pgmMutex);
                PgcnRegistry::const_iterator i = _pgcnRegistry.find(id);
                return i != _pgcnRegistry.end() ? i->second.get() : 0L;
        }

};

REGISTER_OSGPLUGIN(pgm, ReaderWriterPagedModel);

添加模型时:
        long key = ReaderWriterPagedModel::registerNode(_pIVENode );
        _pPagedLod->setFileName(0, ReaderWriterPagedModel::makeURI(key));
        _pPagedLod->setRange(0, dMinVisualDistance, dMaxVisualDistance);

该用户从未签到

 楼主| 发表于 2015-6-3 17:17:01 | 显示全部楼层
anlingbin 发表于 2015-6-2 17:14
你可以试试这样有没有效果,
namespace
{

谢谢分享代码。
我想问下  Threading::ReadWriteMutex 这是哪个库的?
还有,这样自定义插件是为了做啥
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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