首页
社区
课程
招聘
一个比较难的问题,如何用程序(asm or c/c++)控制“垂直同步(V-Sync)”?
2006-3-21 14:46 6658

一个比较难的问题,如何用程序(asm or c/c++)控制“垂直同步(V-Sync)”?

2006-3-21 14:46
6658
我以前写过DirectX程序,其中垂直同步问题困扰了我很长时间。
在DirectX中通过设置D3DPRESENT_INTERVAL_IMMEDIATE来关闭V-Sync,但不总是有效。我写的程序(非常简单,渲染一个圆柱)FPS只有70多,但如果打开3ds max再运行我的程序FPS可以升到200多。
我也问过这个问题,他们说3ds max关闭了V-Sync,所以我的程序也不受限制。
我知道有些显卡可以通过显卡设置程序来打开或关闭垂直同步选项,但我的显卡设置里面没有这个选项。
我想通过程序来实现对V-Sync的控制,请问大家谁有这方面的经验?
这块似乎涉及到了驱动方面的知识,我从来没写过驱动程序。
请问Windows是否提供API来控制驱动程序的属性?
如何通过程序控制V-Sync?
谢谢!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

收藏
点赞7
打赏
分享
最新回复 (8)
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
gzgzlxg 11 2006-3-21 15:14
2
0
你这样提问题,神仙都不能回到,这其实就是硬件问题,首先,你的显示卡必须支持你所想干的事,如果硬件本身都不支持,你软件写到天上去都没有任何用处(另外你的显示器也要用相应的能力)。如果你的显卡确实又这个功能,你应该分析厂家的驱动程序,这些程序通常都是不加密的,很容易反编译,在理解了厂家的驱动后,对厂家的驱动增加你所想要的功能,而不是你自己从新写一个驱动,那太困难,你必须熟悉每一个硬件参数和IO口的设置方法,你有厂家的全部的资料?如果你什么都有了,那写个驱动并非你想象的那样困难,只是需要熟悉一下专门的格式,熟悉一下底层函数的调用,一般这方面的资料比较少,而且许多都没有公开,这才是真正的困难,而不是驱动本身。
另外:我读不懂你的这句话:
“请问Windows是否提供API来控制驱动程序的属性?”
这样的问法有点问题,windows 提供了一系列的底层函数来和驱动程序通讯,但这只不过是简单的传递参数而已,具体某一参数做什么事完全是你在开发驱动时自己定义的(当然这个参数是有一定的生成要求,而且规定只能大于某一个数(其实可以完全不理这个要求)) Windows 的API 只不过负责将你设计的参数传递给你的驱动,至于你的参数是什么含义,你的驱动接受了某一个参数具体干什么。windows 并不关心(如果这个也管,世界就不会有那么多优秀的病毒了)。
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
HackersWin 2006-3-21 15:37
3
0
我也觉的这个挺难的
但是3ds max是通过什么方式实现的呢?它肯定得有个通用的方法,不管用什么硬件都可以关闭V-Sync。
我是想问有没有办法通过程序实现像3ds max那样的效果
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
gzgzlxg 11 2006-3-22 12:09
4
0
其实最简单的就是分析3d max 是怎样做的,用DEBUG跟踪一下,断点下对了,很容易早到相应的控制代码。
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dwing 1 2006-3-22 12:55
5
0
我只知道如何改OpenGL刷新同步...
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
HackersWin 2006-3-22 16:46
6
0
Debug 3ds max?
这个对我来说太难了!:(
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dwing 1 2006-3-22 16:55
7
0
最初由 HackersWin 发布
Debug 3ds max?
这个对我来说太难了!:(


也许用OpenGL的方法也可以解决:
#pragma comment(lib,"opengl32.lib")
#include <windows.h>
#include <gl/gl.h>

void main()
{
	typedef void (APIENTRY *WGLSWAPINTERVALEXT)(int);
	WGLSWAPINTERVALEXT wglSwapIntervalEXT=(WGLSWAPINTERVALEXT)wglGetProcAddress("wglSwapIntervalEXT");
	//  这个地方初始化OpenGL或Direct3D
	if(wglSwapIntervalEXT)	//注意并不是所有显卡都支持
		wglSwapIntervalEXT(1); // 启动vsync
}
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
gzgzlxg 11 2006-3-23 00:56
8
0
楼上的厉害,支持,对 Opengl 我一窍不通,哈哈。
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
HackersWin 2006-3-23 13:56
9
0
最初由 dwing 发布
也许用OpenGL的方法也可以解决:
[CODE]
#pragma comment(lib,"opengl32.lib")
#include <windows.h>
#include <gl/gl.h>
........

谢谢!
我试试!
游客
登录 | 注册 方可回帖
返回