查看: 5012|回复: 22

osg占用CPU过大,帧速问题

[复制链接]

该用户从未签到

发表于 2011-7-15 14:05:10 | 显示全部楼层 |阅读模式
用osgviewer.exe运行cow.osg,CPU占用会超过50% ,看了一下帧速大概在100到200多,问过array,他说要开启垂直同步,不过我现在用的这电脑显卡是inter g33/g31 express chipset family集成显卡,好像没有垂直同步。 后来我在程序中用类似这样的语句

while(!viewer->done())
{
   
      viewer->frame();
      Sleep(40);
}

这样在运行cow.osg时候,帧速降到60左右的样子,CPU占用也下来了。   现在的问题,如果我加载其他的模型,比如osgEarth的模型,在没有Sleep(40)的情况下,帧速有60左右,但是CPU占用也会超过50% ,如果加上   Sleep(40);后 帧速降到10左右,很卡。   

这个是什么问题呢。
好像opengl对A卡的支持不好,是不是显卡的问题?

该用户从未签到

发表于 2011-7-15 16:55:00 | 显示全部楼层
您那个不叫A卡……叫集成破卡……垂直同步都不支持那神仙也没办法,这种情况下很多效果都实现不了,效率也偏低,这是再正常不过的

该用户从未签到

 楼主| 发表于 2011-7-15 18:00:11 | 显示全部楼层
回复 2# array


    谢谢array的回答。之前遇到过几个问题感觉都是显卡的问题,在学校实验室运行的好好的,到了这台机器上就不行。只能等回去试试了

该用户从未签到

发表于 2011-7-16 00:24:41 | 显示全部楼层
while(!viewer->done())
{
   
      viewer->frame();
      Sleep(40);
}
这段代码是典型的死循环,CPU占用自然是100%,如果双核的话就是50%,你的电脑应该是双核CPU。
针对这种情况,如果想降低CPU占用率就应该在场景有变动的时候调用viewer->frame();而不是在死循环中调用。调用Sleep函数是不合适的。

该用户从未签到

发表于 2011-7-16 00:50:37 | 显示全部楼层
:L:L

你这里没有必要sleep,直接循环就可以了,可以设置下最大的帧率,setRunMaxFrameRate~~~~~

该用户从未签到

发表于 2011-7-18 08:19:04 | 显示全部楼层
while(!viewer->done())
{
   
      viewer->frame();
      Sleep(40);
}
这段代码是典型的死循环 ...
sky11811 发表于 2011-7-16 00:24


在开启垂直同步的情况下,不会达到100%;我这里运行小程序事实上是0(因为察觉不到),当然我不会用Sleep()

该用户从未签到

发表于 2011-7-18 11:28:26 | 显示全部楼层
while(!viewer->done())
{
   
      viewer->frame();
      Sleep(40);
}
这段代码是典型的死循环 ...
sky11811 发表于 2011-7-16 00:24

建议你验证一下你的话.即使不开启垂直同步,这段代码也不会导致cpu满负荷。

该用户从未签到

 楼主| 发表于 2011-7-19 11:33:03 | 显示全部楼层
回复 4# sky11811


    谢谢您的回复。我这段while循环的是参考一些osg与MFC结合的例子上的。 我用osgviewer.exe 运行cow.osg。 cpu的占用率也会达到50%以上。所以正如array所说,我现在也怀疑是否为显卡的原因。

该用户从未签到

 楼主| 发表于 2011-7-19 11:39:07 | 显示全部楼层
回复 5# FlySky


    谢谢您的回复,这用Sleep()是为了测试一下,呵呵。我用的这个版本的osg貌似没有setRunMaxFrameRateset,换一个版本试试。

该用户从未签到

发表于 2011-7-20 22:59:42 | 显示全部楼层
我也遇到了这个问题,开启了垂直同步但还是cpu占用51%

显卡:N卡  GT 240

该用户从未签到

发表于 2011-7-21 14:20:37 | 显示全部楼层
看一下OpenGL信息,是否硬件加速已经启用,没有启用则使用GDI加速,就会很卡

该用户从未签到

发表于 2011-9-29 23:43:44 | 显示全部楼层
回复 11# hwliu11


    请问如何启用。

该用户从未签到

发表于 2011-9-30 14:19:46 | 显示全部楼层
建议你验证一下你的话.即使不开启垂直同步,这段代码也不会导致cpu满负荷。
aya_daxiang 发表于 2011-7-18 11:28



    这个还用验证吗?
未命名.jpg

该用户从未签到

发表于 2011-9-30 14:44:33 | 显示全部楼层
这个不是什么大问题,3D实时程序占用cpu高是很正常的。
还有人建议我验证,那么你不配与我交流。
在开启显卡垂直同步的时候,opengl帧速会试图与显示器刷新率匹配,并小于等于显示器刷新率,这时小场景的cpu占用率会比较低。
在关闭垂直同步的时候,opengl帧速与显示器刷新率无关,但可能导致图像撕裂,这时不管场景大小都应该单核cpu满负荷。

一个死循环导致单核满负荷的问题还想不明白,真是无语了。
如果说我的截图里不是100%,那是因为CPU要照顾的不是你一个程序,当然不是绝对的100%。

要cpu占用低,那么就在场景有变动的时候frame,而不是时时frame。

建议好好学习opengl再来学习osg,否则就会有很愚蠢的行为。

该用户从未签到

发表于 2011-9-30 14:58:02 | 显示全部楼层
要是想偷懒就就在osg里限制最大帧速。
楼主你应该明白,你提的问题和显卡没有一点关系,显卡好与坏都是这个鸟样,这是概念问题不是硬件问题。

我又想抱怨了,osg真是害死不少菜鸟,学几天就能写出个唬人的程序,然后菜鸟就自以为了不起了,其实连个狗屁都不是,不能这样说,这样说是对狗屁的侮辱。

没有2年以上艰苦卓绝的opengl学习,(艰苦卓绝是指每天最少10小时),就不要碰osg,osg不是给菜鸟用的。

大多数人提的问题都和osg本身没有任何关系,有的是程序基础不行,有的是计算机图形学理论为0,还有的人逻辑混乱,唉,不说了。

该用户从未签到

发表于 2011-9-30 16:14:26 | 显示全部楼层
回复 14# sky11811

专家,跳脚骂街之前先看清楚:

while(!viewer->done())
{
   
      viewer->frame();
      Sleep(40);
}
   
还用我贴个图么?

该用户从未签到

发表于 2011-9-30 16:52:32 | 显示全部楼层
加上 StatsHandler ,查看一下 Event Cull draw 各个部分占用的时间比例吧
viewer->addEventHandler(new osgViewer::StatsHandler);
看看哪部分占用时间多。

该用户从未签到

发表于 2011-10-1 23:19:43 | 显示全部楼层
本帖最后由 sky11811 于 2011-10-2 02:22 编辑
回复  sky11811

专家,跳脚骂街之前先看清楚:

while(!viewer->done())
{
   
      viewer->frame ...
aya_daxiang 发表于 2011-9-30 16:14



算了,与你交流真是。。。。。。。。。。。。你还好意思高亮显示Sleep。

该用户从未签到

发表于 2011-10-1 23:28:12 | 显示全部楼层
本帖最后由 sky11811 于 2011-10-1 23:40 编辑

真是无语。。。。。。。了

该用户从未签到

发表于 2011-10-3 09:41:14 | 显示全部楼层
回复 19# sky11811

我为什么要不好意思高亮?别编辑阿,留下来大家也能学习学习我的错误不是?

while(!viewer->done())
{
   
      viewer->frame();
      Sleep(40);
}
这段代码是典型的死循环,CPU占用自然是100%,如果双核的话就是50%,你的电脑应该是双核CPU。


   frameRate.JPG   

专家,解释下为什么我跑上面那段代码CPU占用率为什么不是50%么。我的是双核。

该用户从未签到

发表于 2011-10-4 23:24:40 | 显示全部楼层
说句不好听的,要是加Sleep,猪都知道不会CPU满负荷。
我给楼主的回复里,明确表示调用Sleep不合适,我自己测试,当然不会调用Sleep。
行了,到此为止,是我的问题,我认错了。

该用户从未签到

发表于 2011-10-18 09:42:57 | 显示全部楼层
非SingleThreaded模式下,渲染线程是独立的,不会占用到100%
cpu.PNG

该用户从未签到

发表于 2012-6-11 21:18:37 | 显示全部楼层
array 发表于 2011-10-18 09:42
非SingleThreaded模式下,渲染线程是独立的,不会占用到100%

array,我已经在显卡控制面板中设置垂直同步了,为什么我电脑CPU消耗还是很大(50以上)呢?是不是在程序里设置呀?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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