解决glfw的帧率固定的问题

1. 遇到的问题

在使用glfw时,需要显示FPS等性能数据时,渲染后帧率一直保持在60fps,即使渲染一个简单的正方形,其帧率仍保持在60fps左右

2. 解决方法

在google后发现是垂直同步(V-Sync) 的问题,垂直同步的作用是让显卡的运算和显示器刷新率一致以稳定输出的画面质量,就是说显示器能够支持的刷新率是多少,显卡运算的帧率也就多少,因此为了解决帧率固定的问题,需要disable这个垂直同步的功能。

如果在Windows系统下,需要使用wglSwapIntervalExt函数,而该函数定义在头文件wglext.h中,该文件的下载在,在wglext.h文件中声明了Windows所有的特有扩展的入口点。

wglSwapIntervalEXT来自于WGL_EXT_swap_control扩展。它允许在每次缓冲交换之前指定最小帧数。通常这用于垂直同步,该扩展的具体信息可以去其文档中查看。在使用该函数之前,我们需要测试我们的显卡是否支持WGL_EXT_swap_control,并且使用wglGetProcAddress函数获取指向上述函数的指针。

  1. 首先测试我们的显卡是否支持WGL_EXT_swap_control,代码如下:
#include <windows.h>
#include "wglext.h"

bool WGLExtensionSupported(const char *extension_name)
{
    // this is pointer to function which returns pointer to string with list of all wgl extensions
    PFNWGLGETEXTENSIONSSTRINGEXTPROC _wglGetExtensionsStringEXT = NULL;

    // determine pointer to wglGetExtensionsStringEXT function
    _wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC) wglGetProcAddress("wglGetExtensionsStringEXT");

    if (strstr(_wglGetExtensionsStringEXT(), extension_name) == NULL)
    {
        // string was not found
        return false;
    }

    // extension is supported
    return true;
}
  1. 初始化函数指针,代码如下:
PFNWGLSWAPINTERVALEXTPROC       wglSwapIntervalEXT = NULL;
PFNWGLGETSWAPINTERVALEXTPROC    wglGetSwapIntervalEXT = NULL;

if (WGLExtensionSupported("WGL_EXT_swap_control"))
{
    // Extension is supported, init pointers.
    wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC) wglGetProcAddress("wglSwapIntervalEXT");

    // this is another function from WGL_EXT_swap_control extension
    wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC) wglGetProcAddress("wglGetSwapIntervalEXT");
}
  1. 启用或禁用垂直同步
wglSwapIntervalEXT(1);        //启用垂直同步
wglSwapIntervalEXT(0);        //禁用垂直同步

wglGetSwapIntervalEXT();      //获取当前swap interval

参考的链接:
1. how to enable vertical sync in opengl?

猜你喜欢

转载自blog.csdn.net/u014767384/article/details/81545280