opengl 打开和关闭垂直同步方法

来源:互联网 发布:h3c mac过滤 编辑:程序博客网 时间:2024/04/29 07:28

原文地址:http://blog.csdn.net/husongchao/article/details/6771484

垂直同步是涉及到显卡和显示器的一个概念。
当开启了垂直同步,显卡在渲染完成一帧图像之后,显卡需要等待垂直同步信号的到来,
否则无法绘制下一帧。
启用垂直同步,将限制画面更新率和显示器一样,也就是限制了FPS(帧率)。
有关资料(没有完全证实):
在nvidia系列的显卡,垂直同步默认是启用的;
在ATI   系列的显卡,垂直同步默认是不启用的;
在OpenGL中设置垂直同步开关的代码如下:
typedef BOOL (APIENTRY *PFNWGLSWAPINTERVALFARPROC)( int );
PFNWGLSWAPINTERVALFARPROC wglSwapIntervalEXT = 0;
wglSwapIntervalEXT = (PFNWGLSWAPINTERVALFARPROC)wglGetProcAddress("wglSwapIntervalEXT");
wglSwapIntervalEXT(1);//打开垂直分布,限制帧率
wglSwapIntervalEXT(0);//关闭垂直分布,充分发挥显卡的渲染能力

                                           -----------------------------------------------------------------------------------------------------------------------------------------------------------以上摘自【新浪网】


关闭opengl默认的垂直同步机制,让你的FPS飞起来
2010-01-23 19:06


opengl默认情况下,SwapBuffers是和屏幕刷新率同步的,所以你设置的显示器刷新率是60的话,你的opengl程序的FPS只有在60帧。包括nehe的例子程序都是如此,如果要关闭垂直同步功能,需要使用opengl的扩展接口。贴上代码。
typedef void (APIENTRY *PFNWGLEXTSWAPCONTROLPROC) (int);
typedef int (*PFNWGLEXTGETSWAPINTERVALPROC) (void);
PFNWGLEXTSWAPCONTROLPROC wglSwapIntervalEXT = NULL;
PFNWGLEXTGETSWAPINTERVALPROC wglGetSwapIntervalEXT = NULL;
// 初始化函数指针接口
bool InitVSync()
{
char* extensions = (char*)glGetString(GL_EXTENSIONS);
if (strstr(extensions,"WGL_EXT_swap_control")) {
wglSwapIntervalEXT = (PFNWGLEXTSWAPCONTROLPROC)wglGetProcAddress("wglSwapIntervalEXT");
wglGetSwapIntervalEXT = (PFNWGLEXTGETSWAPINTERVALPROC)wglGetProcAddress("wglGetSwapIntervalEXT");
return true;
}
return false;
}
// 判断当前状态是否为垂直同步
bool IsVSyncEnabled()
{
return (wglGetSwapIntervalEXT() > 0);
}
// 开启和关闭垂直同步
void SetVSyncState(bool enable)
{
if (enable)
wglSwapIntervalEXT(1);
else 
wglSwapIntervalEXT(0);
}
使用方法:
bool isOk = InitVSync(); 
if (isOk) {
SetVSyncState(false);
}
这样在初始化的地方使用这些代码可以关闭垂直同步功能,这样FPS可以变的很高。
注意: 需要加入下面的这些代码才能正常编译。
// 包含windows的头文件
#include <windows.h>
// 包含opengl需要用到的头文件(完整的vs编辑器中会自带这些文件)
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glaux.h>
// 设置链接时的库文件
#pragma comment(lib, "OPENGL32.LIB")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glaux.lib") 
---------------------------------------------------------------------------------------------------------------------------------------------------