您的位置:首页 > 运维架构

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

2012-08-21 16:10 2176 查看
原文地址:/article/10548145.html

垂直同步是涉及到显卡和显示器的一个概念。

当开启了垂直同步,显卡在渲染完成一帧图像之后,显卡需要等待垂直同步信号的到来,

否则无法绘制下一帧。

启用垂直同步,将限制画面更新率和显示器一样,也就是限制了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")

---------------------------------------------------------------------------------------------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐