查看: 2612|回复: 19

OSG中批量对象的快速显示

[复制链接]

该用户从未签到

发表于 2012-12-17 22:10:15 | 显示全部楼层 |阅读模式
在场景中添加好多对象,比如加5000个小球,并且是运动的,显示会很慢,场景有跳帧的现象,有什么好的方法实现快速渲染提高绘制速度吗?

该用户从未签到

发表于 2012-12-17 22:29:45 | 显示全部楼层
没办法,换显卡。

该用户从未签到

发表于 2012-12-18 09:54:36 | 显示全部楼层
一种是 考虑合并成一个Geometry,这样分配的VBO对象只有一个,效率提高很多
另一种是 分块调度,前提是您场景中对象的数量超过了相当的数量

该用户从未签到

发表于 2012-12-18 16:54:08 | 显示全部楼层
合并 共享

该用户从未签到

发表于 2012-12-19 08:58:31 | 显示全部楼层
array 发表于 2012-12-18 09:54
一种是 考虑合并成一个Geometry,这样分配的VBO对象只有一个,效率提高很多
另一种是 分块调度,前提是您场 ...

5000个小球就会卡,很显然是硬件问题。

该用户从未签到

 楼主| 发表于 2012-12-19 11:02:46 | 显示全部楼层
array 发表于 2012-12-18 09:54
一种是 考虑合并成一个Geometry,这样分配的VBO对象只有一个,效率提高很多
另一种是 分块调度,前提是您场 ...

谢谢回复,想问一下多个小球osg::Sphere怎样合并成一个Geometry?sphere对象不是应该通过geode节点加入到场景中?这些对象是随时间运动的,该怎样设计?谢谢

该用户从未签到

 楼主| 发表于 2012-12-19 11:05:36 | 显示全部楼层
liuzhiyu123 发表于 2012-12-18 16:54
合并 共享

你好,能不能说详细点,osg::Sphere对象怎样合并到一块,并且这些对象会随时间改变位置是运动的

该用户从未签到

 楼主| 发表于 2012-12-19 11:08:38 | 显示全部楼层
smash 发表于 2012-12-19 08:58
5000个小球就会卡,很显然是硬件问题。

你好,如果是只加载5000个静止的小球对象没问题,关键是小球会随时间改变位置产生运动效果,这样就会跳帧,能否提供些解决方法?谢谢

该用户从未签到

发表于 2012-12-19 12:00:13 | 显示全部楼层
smengq 发表于 2012-12-19 11:05
你好,能不能说详细点,osg::Sphere对象怎样合并到一块,并且这些对象会随时间改变位置是运动的

多个MT共享小球

该用户从未签到

 楼主| 发表于 2012-12-19 12:15:27 | 显示全部楼层
liuzhiyu123 发表于 2012-12-19 12:00
多个MT共享小球

已经这么做了, 还有没有更进一步的提高速率的方法?谢谢

该用户从未签到

发表于 2012-12-19 14:04:38 | 显示全部楼层
smengq 发表于 2012-12-19 11:08
你好,如果是只加载5000个静止的小球对象没问题,关键是小球会随时间改变位置产生运动效果,这样就会跳帧 ...

5000个小球,就算每个100个面片也才50w,调度算法什么的不合适用。
如果是在一个几何体里面并且用了显示列表的,可以试试换成VBO或者把每个小球单独作为一个几何体。

该用户从未签到

发表于 2012-12-20 08:02:10 | 显示全部楼层
smengq 发表于 2012-12-19 12:15
已经这么做了, 还有没有更进一步的提高速率的方法?谢谢

既然可以共享一个小球,没必要做成VBO了吧

该用户从未签到

发表于 2012-12-20 11:34:16 | 显示全部楼层
smengq 发表于 2012-12-19 12:15
已经这么做了, 还有没有更进一步的提高速率的方法?谢谢

如果用了mt的话,静止和动态的帧率应该是差不多的。
你看看是不是计算位置时候的问题。

该用户从未签到

发表于 2012-12-21 09:37:00 | 显示全部楼层
如果已经做到节点共享了,那么这就是足够好的方案了,您的速度慢应该不是渲染效率的问题而是您的更新策略

该用户从未签到

 楼主| 发表于 2012-12-21 09:55:21 | 显示全部楼层
array 发表于 2012-12-21 09:37
如果已经做到节点共享了,那么这就是足够好的方案了,您的速度慢应该不是渲染效率的问题而是您的更新策略

我是这么做的:
将5000个小球(共享一个)分别用mt到某个位置,整个都添加到一个节点group上,然后group->setUpdataCallback(),对group里的5000个球分别改变位置,这样让它产生了动画效果,不知道这样更新是不是合适?有没有更好的让小球运动更新的方法?

该用户从未签到

发表于 2012-12-21 10:59:34 | 显示全部楼层
smengq 发表于 2012-12-21 09:55
我是这么做的:
将5000个小球(共享一个)分别用mt到某个位置,整个都添加到一个节点group上,然后group ...

这样应该没什么问题,你看看setUpdateCallback的执行时间看看是不是过长了。

该用户从未签到

 楼主| 发表于 2012-12-21 11:13:23 | 显示全部楼层
smash 发表于 2012-12-21 10:59
这样应该没什么问题,你看看setUpdateCallback的执行时间看看是不是过长了。

怎么看setUpdataCallback的执行时间?从状态显示上看Event:0.30,upata:168.49,cull:252.13,Draw:505,GPU:450,需要改进哪些方面会提高速率?

该用户从未签到

发表于 2012-12-21 14:48:41 | 显示全部楼层
smengq 发表于 2012-12-21 11:13
怎么看setUpdataCallback的执行时间?从状态显示上看Event:0.30,upata:168.49,cull:252.13,Draw:505,GPU: ...

cull和draw的时间都很长,估计不是计算的问题。静止的话帧率是多少呢?

该用户从未签到

 楼主| 发表于 2012-12-23 20:47:50 | 显示全部楼层
smash 发表于 2012-12-21 14:48
cull和draw的时间都很长,估计不是计算的问题。静止的话帧率是多少呢?

静止下Fram Rate:2.43,Event:0.41,Cull:240,Draw:404,GPU:392

该用户从未签到

发表于 2012-12-23 20:56:38 | 显示全部楼层
smengq 发表于 2012-12-23 20:47
静止下Fram Rate:2.43,Event:0.41,Cull:240,Draw:404,GPU:392

那你静止时候帧率也低的很,要是现在是debug模式,改成release试试,不行只能检查下硬件和驱动了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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