查看: 3010|回复: 11

osg创建实体效率问题

[复制链接]

该用户从未签到

发表于 2011-2-23 14:07:16 | 显示全部楼层 |阅读模式
我在mfc框架中做了一个简单的测试程序,循环创建1万个简单的球,发现创建的过程比较长,不知道有没有什么方法可以提高创建的效率?不是渲染效率
代码简单示例如下:
for(int i=0;i<10000;i++)
{
  geode->addDrawable(new osg::ShapeDrawable(new osg::Sphere(center,1)));
}
这段代码耗费时间比较长

该用户从未签到

发表于 2011-2-23 17:18:52 | 显示全部楼层
每创建一个Drawable都意味着在OpenGL端构建一个新的显示列表,您应该尽可能地合并自己的几何体以避免这种资源的消耗

该用户从未签到

发表于 2011-2-23 17:34:59 | 显示全部楼层
嗯,可以创建一个球,然后其他的球实例化这个球

该用户从未签到

 楼主| 发表于 2011-2-26 07:42:02 | 显示全部楼层
本帖最后由 garyliyong 于 2011-2-26 07:43 编辑

我又进行了测试,先创建一个几何节点cylinder,cylinder节点中包含一个标准的圆柱体,然后我再使用MatrixTransform节点添加cylinder节点,还是和以前一样循环添加10000次,发现创建速度是快了,但显示帧速降到2.9左右,我猜想是渲染的的时候需要进行大量的矩阵变换计算从而降低了帧速,我想问一下,有什么很好的方法解决这两个问题吗? 创建速度比较快,显示帧速又高

该用户从未签到

发表于 2011-2-26 16:03:54 | 显示全部楼层
回复 4# garyliyong


    显然不是矩阵运算的原因,我觉得应该是node节点过多,场景维护效率降低了。可以试试自己计算顶点创建形状,应该会快很多。

该用户从未签到

 楼主| 发表于 2011-2-27 09:13:54 | 显示全部楼层
我现在测试读取一个模型文件,里面结构为model里含有若干区域area,area里有若干零件part,part里有若干圆柱体,球体等,我初始想法是建立如下场景树结构: 无标题.png 圆柱体大小朝向中心位置各不相同,按照设计part应该是几何节点,然后添加若干shapedrawable,但创建过程有点耗时,后经建议将圆柱体单独设置成一个几何节点,使用变换矩阵进行旋转,缩放,平移,那就每个part下要加若干个变换节点,结果创建速度是快了,但这样显示帧速不是很高,不知道大家有没有更好的方案?实际我需要读的文件含有若干个这样的模型文件,读取速度和显示帧速都是很重要的

该用户从未签到

发表于 2011-2-28 08:30:54 | 显示全部楼层
我认为10000个节点共享几何体实例实在是小意思,遍历速度不会下降很多,渲染的效率则会大大增加。您是否在代码实现中存在什么错误

该用户从未签到

 楼主| 发表于 2011-2-28 17:51:59 | 显示全部楼层
本帖最后由 garyliyong 于 2011-2-28 18:32 编辑

测试代码如下:
osg::ref_ptr<osg::Geode> CreateCylinder()
{
        osg::ref_ptr<osg::Geode> cylinder=new osg::Geode;
        osg::ref_ptr<osg::TessellationHints> hints=new osg::TessellationHints;
        hints->setDetailRatio(0.5);
        osg::ref_ptr<osg::ShapeDrawable> sd=new osg::ShapeDrawable(new osg::Cylinder(osg::Vec3(0,0,0),0.3,1),hints);
        sd->setColor(osg::Vec4(0.0,1.0,0.0,1.0));
        cylinder->addDrawable(sd);
        return cylinder;
}
int main()
{
        osg::ref_ptr<osgViewer::Viewer> viewer=new osgViewer::Viewer;

        osg::ref_ptr<osg::Group> gp=new osg::Group;
         osg::ref_ptr<osg::Geode> cylinder=CreateCylinder();
        osg::ref_ptr<osg:ositionAttitudeTransform> pat;
        for (int i=0;i<100;i++)
        {
                for (int j=0;j<100;j++)
                {
                        pat=new osg::PositionAttitudeTransform;
                        pat->setPosition(osg::Vec3(i,j,0));
                        pat->addChild(cylinder);
                        gp->addChild(pat);
                }
        }
        viewer->setSceneData(gp);
        viewer->addEventHandler(new osgViewer::StatsHandler);
        return viewer->run();
}
大家帮我分析下原因吧,看看代码有什么问题,谢谢了 另外利用osg对大模型的处理我没有什么经验,希望大家能指导一下,或者提供个例子作为参考.

该用户从未签到

发表于 2011-3-1 08:38:53 | 显示全部楼层
在我这里观看全局时帧速30-40左右,距离拉近后达到60fps。大规模场景的浏览有必要进行场景分级分块,vpb制作地形时即使用四叉树的概念来实现海量数据的浏览

该用户从未签到

 楼主| 发表于 2011-3-1 18:03:20 | 显示全部楼层
array那为什么我的机器就不行呢?学校的机器配置很高的,速度也不行,是osg版本的问题吗?我的是2.9.9的 还是其它什么问题 真奇怪

该用户从未签到

发表于 2011-3-2 08:44:49 | 显示全部楼层
显示驱动,其它运行程序的影响,还有您的心态,都可能是影响的因素

该用户从未签到

发表于 2011-11-2 09:56:41 | 显示全部楼层
回复 5# smash


如果实现共享几何体,就必须有MatrixTransform和Geode,从而导致节点过多。逐个几何体绘制的话,Opengl的显示负荷较大。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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