查看: 1594|回复: 5

同一个模型(自身有30个geometry),在场景中重复加载几百次,只是位置不同,如何优化

[复制链接]

该用户从未签到

发表于 2013-1-6 17:36:10 | 显示全部楼层 |阅读模式
如题:
     我的场景中重复加载了同一个树木模型,树木模型自身有30个drawable,每片叶子都是一个节点!每一颗树的位置不一样,放缩的大小不一样以及朝向不一样而已,但是模型都是同一个模型!这样的话,能否有什么优化的策略呢???现在因为单个模型自身节点太多,加载几百棵树木以后,渲染帧速特别的低!只有个位数,不知道同一个模型重复加载可否优化,以提升帧速!内存还行,只有300M左右!望各位大哥指点一二,不甚感谢!

该用户从未签到

发表于 2013-1-7 09:28:53 | 显示全部楼层
instance是必须的,常规上可以用多个Matrixtransform来指向同一个树木Geode;更复杂一些可以用上draw instanced的特性来完成硬件级别的加速

该用户从未签到

发表于 2013-1-7 10:30:25 | 显示全部楼层
  1. std::map<std::string,osg::ref_ptr<osg::MatrixTransform> > mapModels; //模型名称,矩阵变化节点

  2. osg::MatrixTransform* model = NULL;
  3. std::map<std::string,osg::ref_ptr<osg::MatrixTransform> >::const_iterator citer = mapModels.find("模型名称");
  4. if (citer == mapModels.end())
  5. {
  6.         std::string fileName = "models\" + "模型名称" +".ive";
  7.         osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(fileName);
  8.         if (!node)
  9.         {
  10.                 std::cout<<"can not find model file: "<<fileName<<std::endl;
  11.                 continue;
  12.         }
  13.         osg::MatrixTransform* mat = dynamic_cast<osg::MatrixTransform*>(node.get());
  14.         if (!mat)
  15.         {
  16.                 mat = new osg::MatrixTransform;
  17.                 mat->addChild(node.get());
  18.         }
  19.         mapModels["模型名称"] = mat;
  20.         model = mat;
  21. }
  22. else
  23. {
  24.         model = mapModels["模型名称"].get();
  25. }

  26. osg::MatrixTransform* mat = new osg::MatrixTransform(*model);


  27. std::map<std::string,osg::Group*> m_mapResult;  //模型名称,模型组节点
  28. std::map<std::string,osg::Group*>::iterator iter = m_mapResult.find("模型名称");
  29. if (iter == m_mapResult.end())
  30. {
  31.         osg::Group* group = new osg::Group;
  32.         m_mapResult["模型名称"] = group;
  33. }

  34. mat->setMatrix(osg::Matrix::scale(xScale,yScale,zScale) * osg::Matrix::rotate(angle,osg::Z_AXIS) * osg::Matrix::translate(postion)));
  35. mat->setName("模型名称");
  36. (m_mapResult["模型名称"])->addChild(mat);
复制代码
恩 这是我的方法 用个map 保存模型的节点就是咯  同名模型就只需要加载一次咯

该用户从未签到

 楼主| 发表于 2013-1-7 15:46:33 | 显示全部楼层
谢谢各位!不过个人认为木子匕兄的关于同名模型只加载一次只是减小了内存的消耗,不会提升渲染的帧速吧!array大哥的instance方式我还有待研究,谢谢二位指点!

该用户从未签到

发表于 2013-1-8 14:46:58 | 显示全部楼层
buptronin 发表于 2013-1-7 15:46
谢谢各位!不过个人认为木子匕兄的关于同名模型只加载一次只是减小了内存的消耗,不会提升渲染的帧速吧!ar ...

研究好啦 顺便也告诉下我!

该用户从未签到

发表于 2013-1-9 11:13:28 | 显示全部楼层
对渲染速度也会有提升,这是cpu级别的instance,减少了显存中保存的对象数目
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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