查看: 2212|回复: 21

osg三通道帧率下降的很厉害

[复制链接]

该用户从未签到

发表于 2010-8-17 18:10:08 | 显示全部楼层 |阅读模式
我用双GT480显卡桌面扩展的方式实现三通道,发现运行osg的例子时帧率下降的很厉害,如果用单通道有500多帧,用了三通道后帧率下降到10帧,不知道是怎么回事,我的osg版本是2.9.9。
a1.jpg

a2a.jpg

该用户从未签到

发表于 2010-8-18 08:55:58 | 显示全部楼层
如果可能的话,请尽量让您的3个Camera共享同样的场景数据节点,而不是各自新建

该用户从未签到

 楼主| 发表于 2010-8-18 09:09:37 | 显示全部楼层
我没有新建camera,例子上好像只有一个camera,我运行的是osgforest的例子。

该用户从未签到

发表于 2010-8-18 09:23:09 | 显示全部楼层
您的“三通道”截屏上不是出现了三个Camera吗

该用户从未签到

 楼主| 发表于 2010-11-23 16:42:17 | 显示全部楼层
谢谢,已经解决了,我把view的渲染模式设置成单线程帧率就上来了。

该用户从未签到

 楼主| 发表于 2010-11-23 16:44:01 | 显示全部楼层
不知道为什么会这样

该用户从未签到

发表于 2010-11-23 16:54:24 | 显示全部楼层
单线程还能提高帧率,奇怪的,是哪里的问题呢

该用户从未签到

发表于 2010-11-23 22:46:02 | 显示全部楼层
单线程和多线程并不存在效率上的差别,如果可以找到CPU在计算上的拐点,合理的利用每一帧的CPU时间,单线程会更加稳定。

该用户从未签到

发表于 2010-11-24 08:30:42 | 显示全部楼层
单线程和多线程并不存在效率上的差别
效率上的区别还是很明显的
如果可以找到CPU在计算上的拐点,合理的利用每一帧的CPU时间
即使把这个层面的优化做到极致,也无法弥补swapBuffer时的帧延迟造成的空闲,详情可以参考《最长的一帧》

该用户从未签到

发表于 2010-11-24 11:24:56 | 显示全部楼层
嗯,多线程的效率提升时明显的

该用户从未签到

发表于 2010-11-24 15:14:37 | 显示全部楼层
哦,多谢指教! 不过多线程并不好控制,特别是在不同的PC上运行结果都可能不同。而且很容易会造成CPU的波动。特别是在子线程中removeChild(),有时会报错而直接退出渲染循环,不知是何缘故?

该用户从未签到

发表于 2010-11-24 15:20:18 | 显示全部楼层
而且OSG通常并不存在真正意义上的单线程,好像至少有5个线程。用openthreads开辟的线程在卸载资源的时候不知如何与主线程同步?

该用户从未签到

发表于 2010-11-25 08:38:14 | 显示全部楼层
哦,多谢指教! 不过多线程并不好控制,特别是在不同的PC上运行结果都可能不同。而且很容易会造成CPU的波动。特别是在子线程中removeChild(),有时会报错而直接退出渲染循环,不知是何缘故?
aaa696 发表于 2010-11-24 15:14


经过了一些改动之后,目前的版本已经比较稳定了,我很少发现它本身存在什么问题,除非您自己的处理方式存在危险性(在OSG线程以外的地方进行修改必然是易错的,您必须选择更新回调等方式)

该用户从未签到

发表于 2010-11-25 08:38:56 | 显示全部楼层
12# aaa696


设置为SingleThreaded就是单线程方式运行了

该用户从未签到

发表于 2010-11-25 10:23:01 | 显示全部楼层
Array说的没错,应该尽量使用回调方式。但是有时计算量较大,会造成帧率下降。想单独开线程却没有解决好资源的回收问题!
回调应该也是在同一线程执行的吧?所以回调中的大量计算也会造成渲染的停滞。

该用户从未签到

发表于 2010-11-25 16:04:21 | 显示全部楼层
大量的计算理应使用独立的线程去完成,至于计算结果和场景的交互,只要小心应用资源互锁的机制就可以完成

该用户从未签到

发表于 2010-11-25 19:57:49 | 显示全部楼层
其实我只是将一个根节点传到独立线程里,在线程中对这个根节点添加或删除子节点,而这些子节点都不会与主线程共享,应该不存在资源互斥的问题吧? 但是在线程中有时删除子节点时会报错(不过也不是每台机器都这样)。

该用户从未签到

发表于 2010-11-26 08:34:54 | 显示全部楼层
其实我只是将一个根节点传到独立线程里,在线程中对这个根节点添加或删除子节点,而这些子节点都不会与主线程共享,应该不存在资源互斥的问题吧? 但是在线程中有时删除子节点时会报错(不过也不是每台机器都这样)。 ...
aaa696 发表于 2010-11-25 19:57


事实上这样很有问题,因为您在独立线程中对场景节点进行改动时,完全不能确定此时系统是否正在渲染这个节点——这样必然是不稳定和容易崩溃的,设置DYNAMIC也无用。正确的做法是仅仅在独立线程中得到计算结果,然后在更新回调中完成将结果加入场景图(即向某个节点添加或删除子对象)的操作

该用户从未签到

发表于 2010-11-26 11:00:15 | 显示全部楼层
原来是这样,也就是说要在独立线程计算出结果以后将数据共享出来并BLOCK本线程,直到更新回调中将这些数据都利用完毕再RELEASE.已达到数据同步。这样可以吧?
当然也可以用资源互斥,不过这样就有可能更新回调会漏掉一些处理结果(如果独立线程执行够快的话)。这样理解正确吗?

该用户从未签到

发表于 2010-11-26 15:19:36 | 显示全部楼层
我想可以考虑您所说的策略

该用户从未签到

发表于 2010-11-26 15:47:47 | 显示全部楼层
在osg里开线程,可以用集成的openThread吧?

该用户从未签到

发表于 2010-11-26 21:22:21 | 显示全部楼层
当然可以,我就是用的openThreads! 使用Windows API 反倒感觉风格不统一,呵呵。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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