解决glfw的帧率固定的问题

在使用glfw时遇到帧率被限制在60fps的问题,原因是垂直同步(V-Sync)导致。通过查找资料,了解到解决方法是禁用垂直同步。在Windows系统下,需要使用特定的函数来实现,首先需要测试显卡是否支持此功能,然后初始化并启用或禁用垂直同步。参考相关链接可获取更多实现细节。

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?

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值