查看: 3093|回复: 8

怎么提高渲染效率?

[复制链接]

该用户从未签到

发表于 2009-11-2 22:54:12 | 显示全部楼层 |阅读模式
我用如下的方法来建立了3000个四边型,渲染速度很慢
不知道怎样做才能提高效率,请指教
osg::Geode* createQuad()
{
osg::Geode* geode1 = new osg::Geode();
osg::Geometry* geom = new osg::Geometry();
.....
return geode1
}

int main()
{
     osg::group* root = new osg::group();
     for (int i=0;i<3000;i++)
     {
          root->addchird(createQuad());
     }
     viewer....
     ....
     run();
}

请教下怎样做才能渲染快点,我这样做需要3秒左右来渲染!太慢了...
  • TA的每日心情
    开心
    2019-11-11 10:36
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2009-11-2 23:12:06 | 显示全部楼层
    把createQuad先做好,拼成ive文件,当模型读进去

    该用户从未签到

    发表于 2009-11-3 08:29:22 | 显示全部楼层
    一个稍微提高效率的方法是:建立一个Geode,然后向其中存储3000个Geometry对象;但是由于显示列表被建立了3000个,显示内存的压力依然很大。

    另一个大幅度提高效率的方法正如FreeSouth所说,不过可以简化一些,即:createQuad()函数只调用一次,得到的Geode对象被3000个MatrixTransform节点所引用(并改变它们的空间位置和姿态),然后所有的MatrixTransform节点都被根节点引用。形成的结构大致为:
    root
    |_______________
    |        |        |       |
    MT1  MT2   ......   MT3000
    |____|____|_____|
    |
    Geode
    这样显示列表只建立了1次!

    该用户从未签到

    发表于 2009-11-3 08:48:22 | 显示全部楼层
    传 说中的instance功能,呵呵

    该用户从未签到

    发表于 2009-11-3 09:12:40 | 显示全部楼层
    嗯,GinTing提醒的对~~还有OpenGL最新的draw_instance扩展,这是硬件级别的优化策略;不过如果楼主是初学的话,难度可能比较大;参照osgdrawinstanced例子吧

    该用户从未签到

     楼主| 发表于 2009-11-3 11:22:55 | 显示全部楼层
    回答freesouth,我准备做一个动态的模型,也就是可能里面的节点随时会变化!如果做成模型读进去的话,可能就固定了!
    回答array,你的第二种方法应该是比较好的,我尝试下...
    回答GinTing, 如果真是好的话,我是不会畏惧艰难地,嘿嘿

    该用户从未签到

    发表于 2009-12-9 14:29:09 | 显示全部楼层
    为什么不用一个Geode下加一个Geometry,然后设置Geometry的顶点,形成3000个你要的图形呢

    该用户从未签到

    发表于 2011-7-2 21:58:57 | 显示全部楼层
    楼主,我现在采用了array说的第二种方法,感觉效率仍不是很快啊,不知道楼主还有什么更好的方法?

    该用户从未签到

    发表于 2011-7-4 08:36:06 | 显示全部楼层
    因为显卡是不可能无限承载这种大批量的数据的,请为它着想一下,设置空间索引和LOD的策略吧
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

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

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

    联系我们

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