查看: 2216|回复: 8

安装两个显示器后OSG程序占用大量CPU

[复制链接]

该用户从未签到

发表于 2009-11-20 10:49:34 | 显示全部楼层 |阅读模式
两个显示器如果采用水平跨越的话是不会出问题的,
但是如果采用独立显示的方式,就会出现占用大量CPU的问题(双核的机器,会占用50%,也就是占满一个CPU)。
我是以OSG为基础写的一个3维程序,里面含有大量的图片,采用水平跨越的方式只会占用3%的CPU。

不知道从何查起,请问可能会是什么原因造成这种情况,或者有没有什么方法(或软件)能够找到程序在什么地方的代码占用了过多的CPU?

该用户从未签到

发表于 2009-11-20 12:22:01 | 显示全部楼层
您是如何采用“独立显示”的方式的?设置两个GraphicsContext并给它们的Traits传递不同的screenNum?您又是如何实现两个显示器的“水平跨越”呢?或许您可以说的再详细一点。

事实上论坛里刚刚讨论过类似的问题,就是OpenGL的“非多线程”性质带来的损耗。OpenGL在本质上还不能够实现多线程的设备绑定,也就是wglMakeCurrent在一个时刻只能作用于一个Rendering Context——我个人认为这才是造成同一台机器上多个窗口(或显示屏)同时渲染时效率低下的问题所在。并且在OpenGL自身得以改善之前,目前恐怕还没有什么有力的解决方案。

该用户从未签到

发表于 2009-11-24 20:52:18 | 显示全部楼层
本帖最后由 口口广大 于 2009-11-24 22:32 编辑

正好也碰到这个问题,学习。我用google搜索osg two screen没发现有相似的问题描述,是否有其他解决方法?

我搜索到得官方论坛的回复有下面这句话

Here we use OSG on multi-monitor setups on both XP and Vista and for the
>> most part things work well, though we use the threading mode that OSG
>> chooses for us so I'm not sure it's the same one you use.

该用户从未签到

发表于 2009-11-25 08:33:30 | 显示全部楼层
好像说的不是同一个问题。

口口广大 指的是Complete garbage那个帖子吧?这个英文的意思是“完全是垃圾”,也就是说那个帖子的情况是画面完全花了……

该用户从未签到

发表于 2009-11-25 19:26:13 | 显示全部楼层
我发现用osg2.8,只要采用双屏独立显示模式(这个模式是在显卡驱动里面设置),连运行自带的任意例子example都会出现占用大量CPU的问题(双核的机器,会占用50%,也就是占满一个CPU)。

该用户从未签到

发表于 2009-11-25 23:26:43 | 显示全部楼层
这个不好说了,和硬件设置都有关系;OSG默认的帧速率会自动和显卡的垂直同步频率相符,但是调整了显卡选项之后可能会改变,因而占用更多的CPU以提升帧速率

该用户从未签到

 楼主| 发表于 2009-11-28 15:15:30 | 显示全部楼层
本帖最后由 xiaofeii 于 2009-11-28 15:28 编辑

2# array
抱歉前两天太忙,没时间上网。
和设置screennum没有关系,只要安装了两个显示器,并且设置两个显示器的显示模式为独立显示的话,一个正常的osg程序只在其中的主屏上显示就会出现占满CPU的情况,而且这个程序即使是单view也是如此。

我的意思是说 只要再安装了一个显示器后并配置为独立显示之后,原来正常的osg程序就会占用大量CPU。这个osg程序仅仅是single view,没有使用两个GraphicsContext,正如口口广大 所说,osg附带的任意例子也会出现这样的问题。所以这样的程序运行时应该不会来回切换GraphicsContext吧?虽然安装了多个显示器,osg程序还是只在其中的一个屏上显示,因此wglMakeCurrent应该始终作用于一个Rendering Context吧?和硬件相关的opengl显示方面我了解太少了,只是提出一些疑问。希望array能在讲讲。

PS 我所说的显示器独立配置的意思是这样的:
如果我在一台主机上安装两个显示器的时候,nvidia显卡就会给出选项让我选择如何配置这两个显示器。配置的方式会有五种:
a 仅使用一个显示器
b 使两个显示器显示相同的画面
c 以水平跨越方式显示
d 以垂直跨越方式显示
e 独立配置两个显示器
我说的独立配置就是指的e项。

该用户从未签到

发表于 2009-11-28 17:07:48 | 显示全部楼层
这样的话,也许您需要检查硬件上的设置,这和编程方法恐怕无关。

此外也可以通过查看帧速率来判断:正常情况下,OSG程序的帧速率应该和屏幕同步刷新频率相等,例如60fps;如果此时帧速率远高于这个值。说明您的显示设备为了实现多个显示器的配置而关闭了它的垂直同步~~如果您的OSG版本高于2.8的话,那么可以设置viewer.setRunFrameScheme(ON_DEMAND),实现按需渲染

该用户从未签到

发表于 2009-11-29 21:06:49 | 显示全部楼层
我后来采用 c 以水平跨越方式显示 cpu使用率就会降下来,或者是e 独立配置两个显示器时在驱动程序的3D设置内,将3D的多屏运行设置强制改为单屏模式,当然这两种方法只适合于程序虽然需要双屏,但3D只需要在一个屏显示的情况
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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