VC++ OpenGL运行卡,选择显卡问题

Swkjd 2012-04-14 10:17:03
早先时候用OpenGL在vc++ 2005下写了个程序,运行很卡,开始以为是电脑问题(单核XP年代的机子),没在意,后来在i7的机子上跑一样卡到无法忍受,用vc++ 2010重新做了一遍也不行。。今天终于发现程序默认情况是在主板的集成显卡上跑的,在nvidia显卡面板里手动设置为独立显卡运行后流畅无比。。

请问有没有什么方法可以在代码层面或者VC工程层面设置程序默认运行显卡,即让程序在有独立显卡的情况下优先选择在独立显卡下运行?
...全文
1266 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Swkjd 2012-05-18
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]

引用 19 楼 的回复:

查了一晚上,通过setup api可以查到显卡信息了,但应该怎么设置程序的运行显卡呢?找了好久就是……


你又想多了吧...
你应用程序只能决定是使用硬件加速还是软件模拟。
切换的话,现在都是计算机厂商间自己定的协议。没有通用性,所以没有什么确定的api。
我说过现在还做不到两块显卡同时共用一个屏幕。你知道这句话的意思是什么?意思是你想在不切换的情……
[/Quote]

好吧。。谢谢你了,决定放弃。。其实我不是计算机专业的,所以这类东西完全不懂。。不蛋疼了。。
unituniverse2 2012-05-11
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]

查了一晚上,通过setup api可以查到显卡信息了,但应该怎么设置程序的运行显卡呢?找了好久就是……
[/Quote]

你又想多了吧...
你应用程序只能决定是使用硬件加速还是软件模拟。
切换的话,现在都是计算机厂商间自己定的协议。没有通用性,所以没有什么确定的api。
我说过现在还做不到两块显卡同时共用一个屏幕。你知道这句话的意思是什么?意思是你想在不切换的情况下让程序自己决定使用另一张显卡,目前是做不到的。因为那意味着两块显卡同时操作屏幕的内容。

怎么那么纠结呢...如果是你们老板非要你想办法解决,这老板神马都不懂吧,这种菜鸟要求都会提...
Swkjd 2012-05-11
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

引用 16 楼 的回复:

windows不区分独显还是集显。只有一个显示适配器设备类型。设备id……


Setup api吧。查到后也没什么用:你还要知道怎么切换(除非系统自己根据负载自动切换)。现在还做不到两块显卡同时共用一个屏幕...
[/Quote]

查了一晚上,通过setup api可以查到显卡信息了,但应该怎么设置程序的运行显卡呢?找了好久就是找不到。。切换应该不用,只要程序一开始的时候设置成某张显卡就行了。
  • 打赏
  • 举报
回复
一般独立显卡的驱动一幢就没有事情了, 你的驱动有bug?
Swkjd 2012-05-09
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

引用 14 楼 的回复:
那请问下独显的pid和vid可以和集显区别出来吗?我的意思是我不知道对应显卡的准确id,但是能否从id看出该显卡是独显还是集显?如果可能的话,那就选一个非集显运行就ok了,这样就算以后新显卡出来,只要可以判断出不是集显,那就让程序在上面跑。这样可行吗?


windows不区分独显还是集显。只有一个显示适配器设备类型。设备id都是独立的。且没有什么规则。id到……
[/Quote]

那能不能获得厂商名?例如opengl里的glGetString(GL_VENDOR)就能的到当前运行的显卡厂商名。VC里是否有什么api可以查到系统下的显卡厂商呢?只要存在厂商不是intel的显卡,我就让程序在上面跑,这样可能不?
unituniverse2 2012-05-09
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

windows不区分独显还是集显。只有一个显示适配器设备类型。设备id……
[/Quote]

Setup api吧。查到后也没什么用:你还要知道怎么切换(除非系统自己根据负载自动切换)。现在还做不到两块显卡同时共用一个屏幕...
unituniverse2 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
那请问下独显的pid和vid可以和集显区别出来吗?我的意思是我不知道对应显卡的准确id,但是能否从id看出该显卡是独显还是集显?如果可能的话,那就选一个非集显运行就ok了,这样就算以后新显卡出来,只要可以判断出不是集显,那就让程序在上面跑。这样可行吗?
[/Quote]

windows不区分独显还是集显。只有一个显示适配器设备类型。设备id都是独立的。且没有什么规则。id到底是多少都是硬件厂商自己定的,没有一个统一的标准。预定义的设备类型由微软定,但是对你来说没什么用(不区分独显还是集显)。
Swkjd 2012-05-06
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

引用 12 楼 的回复:
所以我并不想更改程序架构,只是不知道是不是可以让程序默认在机器的独立显卡上跑,因为一般独显的驱动都是完整的,不知道这样做是不是可以跳过显卡型号探测。。


除非在只有独显的机器上跑...
反正你又不是每次都要在软件里面自己设置一次,所以没关系的。就这样最好的。
探测用的是setup api。先枚举显示适配器设备,然后你要知道所有支持的显卡的pid和vid。……
[/Quote]

那请问下独显的pid和vid可以和集显区别出来吗?我的意思是我不知道对应显卡的准确id,但是能否从id看出该显卡是独显还是集显?如果可能的话,那就选一个非集显运行就ok了,这样就算以后新显卡出来,只要可以判断出不是集显,那就让程序在上面跑。这样可行吗?
unituniverse2 2012-05-05
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
所以我并不想更改程序架构,只是不知道是不是可以让程序默认在机器的独立显卡上跑,因为一般独显的驱动都是完整的,不知道这样做是不是可以跳过显卡型号探测。。
[/Quote]

除非在只有独显的机器上跑...
反正你又不是每次都要在软件里面自己设置一次,所以没关系的。就这样最好的。
探测用的是setup api。先枚举显示适配器设备,然后你要知道所有支持的显卡的pid和vid。如果找到了匹配的就优先选用。。。这个方法会降低兼容性的。新出的显卡总是会给予独立的id。。。现在的游戏都是用这方法选择适合自己运行的显卡。这些游戏过了一段时间后就成了老游戏,他们在新机器上认不出新出的显卡。尽管那些显卡能提供比当时好得多的效果,可是就是不认...
所以劝lz不要自找麻烦了。。。
Swkjd 2012-05-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

驱动正常----指的是你的NVIDA GeForce GT 540M卡,而不是你的集成显卡。
[/Quote]

[Quote=引用 11 楼 的回复:]

opengl驱动现在都是显卡厂商自己提供了的。微软只提供了驱动到标准gl api的过滤层了。不像dx那样会实现一部分功能。。。

劝楼主还是保留你现在这种形式最好,不要再去探测什么显卡了,那样的话兼容性会下降的。比如以后操作系统架构改变了,用了新显卡、新架构了你软件反而还不认了。。。本来你的机器那个双屏切换就是为了隔离软件探测用的...
[/Quote]

所以我并不想更改程序架构,只是不知道是不是可以让程序默认在机器的独立显卡上跑,因为一般独显的驱动都是完整的,不知道这样做是不是可以跳过显卡型号探测。。
unituniverse2 2012-05-05
  • 打赏
  • 举报
回复
opengl驱动现在都是显卡厂商自己提供了的。微软只提供了驱动到标准gl api的过滤层了。不像dx那样会实现一部分功能。。。

劝楼主还是保留你现在这种形式最好,不要再去探测什么显卡了,那样的话兼容性会下降的。比如以后操作系统架构改变了,用了新显卡、新架构了你软件反而还不认了。。。本来你的机器那个双屏切换就是为了隔离软件探测用的...
冷饭村 2012-05-05
  • 打赏
  • 举报
回复
驱动正常----指的是你的NVIDA GeForce GT 540M卡,而不是你的集成显卡。
冷饭村 2012-05-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用 6 楼 的回复:

引用 2 楼 的回复:
呃。。难道和64位系统有关?在http://dev.gameres.com/Program/Visual/3D/openglhw.htm看到这么一句话:

“Windows怎么实现OpenGL硬件加速呢?OpenGL32.dll是微软的OpenGL 1.1纯软件实现,我们的程序都要动态链接到这个dll。如果安装3D芯片厂商的驱动程序,会将……
[/Quote]
我2005年用OpenGL的时间吃过一次这样的亏。我在自己的机上编写的OpenGL程序可以达到50fps以上。但我拿去另的公司展现的时候屏刷只有2帧到3帧,结果当然很糟。原因就是对方公司用的是ghost 版的系统,没有完整驱动。后来用用打包程序把驱动连同程序本身一起安装才解决的。
shiter 2012-05-04
  • 打赏
  • 举报
回复
同学机子上也是直接掉显卡的
Swkjd 2012-05-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 2 楼 的回复:
呃。。难道和64位系统有关?在http://dev.gameres.com/Program/Visual/3D/openglhw.htm看到这么一句话:

“Windows怎么实现OpenGL硬件加速呢?OpenGL32.dll是微软的OpenGL 1.1纯软件实现,我们的程序都要动态链接到这个dll。如果安装3D芯片厂商的驱动程序,会将一个不同名字的dll放到W……
[/Quote]

驱动应该是正常的吧,因为手动设置为独立显卡运行后,效果非常好。。只是不知道程序里怎么设置成默认在独立显卡下运行。。
冷饭村 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
呃。。难道和64位系统有关?在http://dev.gameres.com/Program/Visual/3D/openglhw.htm看到这么一句话:

“Windows怎么实现OpenGL硬件加速呢?OpenGL32.dll是微软的OpenGL 1.1纯软件实现,我们的程序都要动态链接到这个dll。如果安装3D芯片厂商的驱动程序,会将一个不同名字的dll放到Windows系统目录下,比如在……
[/Quote]
就是显卡驱动的问题,在微软推出DirectX后,为了打压OpenGL,在默认情况对某些显卡只提供部分驱动内容。只有安装显卡的标准驱动后才可以正常使用OpenGL。要检测出是完整版还是简装版好像不太容易(微软耍流氓)。在代码中,可以先检测显卡型号,然后再用自己打包的驱动安装一遍。
Swkjd 2012-04-15
  • 打赏
  • 举报
回复
呃。。难道和64位系统有关?在http://dev.gameres.com/Program/Visual/3D/openglhw.htm看到这么一句话:

“Windows怎么实现OpenGL硬件加速呢?OpenGL32.dll是微软的OpenGL 1.1纯软件实现,我们的程序都要动态链接到这个dll。如果安装3D芯片厂商的驱动程序,会将一个不同名字的dll放到Windows系统目录下,比如在Windows 2000下安装nVIDIA GeForce2 MX的驱动程序,会在系统目录下放一个nvoglnt.dll(这就是nVIDIA的OpenGL驱动),并在注册表中登记nvoglnt.dll,让Windows知道硬件加速OpenGL驱动的名字,以后运行OpenGL程序,OpenGL32.dll就会把OpenGL调用直接转到nvoglnt.dll。”

但是我64位的系统下,只在System32下找到个nvoglv64.dll,在SysWOW64下找到个nvoglv32.dll。。我都怀疑这两个文件是不是放反了。。又不敢乱动。。而且确实没看见nvoglnt.dll。。无语啊。。。。

补充下,我是64为win7系统,i7-2670QM,显卡NVIDA GeForce GT 540M,2G显存。
Swkjd 2012-04-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
原来如此
[/Quote]

别原来如此啊。。我只是猜测。。还在坐等大大们解决问题啊。。这种情况到底怎么处理?TT
向立天 2012-04-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

呃。。难道和64位系统有关?在http://dev.gameres.com/Program/Visual/3D/openglhw.htm看到这么一句话:

“Windows怎么实现OpenGL硬件加速呢?OpenGL32.dll是微软的OpenGL 1.1纯软件实现,我们的程序都要动态链接到这个dll。如果安装3D芯片厂商的驱动程序,会将一个不同名字的dll放到Windows系统目录下,比如……
[/Quote]
原来如此
向立天 2012-04-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 3 楼 的回复:
原来如此


别原来如此啊。。我只是猜测。。还在坐等大大们解决问题啊。。这种情况到底怎么处理?TT
[/Quote]我确实没遇到过这种情况
不好妄下推断
加载更多回复(1)

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧