C++ 什么';控制帧速率的常用方法是什么?

C++ 什么';控制帧速率的常用方法是什么?,c++,graphics,C++,Graphics,我是图形新手,所以我不知道人们通常如何控制渲染的帧速率。 我的意思是,如何将应用程序设置为以30fps的速度渲染? 可能有很多API提供这样的功能,但我需要从头开始编写。有两种“常用”的“控制”帧速率的方法,但都不是那么简单 这两个控件中的第一个也是更多的控件,通常是可选的,是VSync。这将强制视频卡在显示器刷新完成时仅推出新帧。许多监视器刷新频率为60 Hz,因此您往往会获得60 FPS 这可以很好地限制帧速率以监视刷新率,但当帧速率下降到刷新率以下时,它将被强制到下一个倍数。因此,当帧速率

我是图形新手,所以我不知道人们通常如何控制渲染的帧速率。 我的意思是,如何将应用程序设置为以30fps的速度渲染? 可能有很多API提供这样的功能,但我需要从头开始编写。

有两种“常用”的“控制”帧速率的方法,但都不是那么简单

这两个控件中的第一个也是更多的控件,通常是可选的,是VSync。这将强制视频卡在显示器刷新完成时仅推出新帧。许多监视器刷新频率为60 Hz,因此您往往会获得60 FPS

这可以很好地限制帧速率以监视刷新率,但当帧速率下降到刷新率以下时,它将被强制到下一个倍数。因此,当帧速率开始下降时,您会损失相当多的潜在渲染时间,因为它被强制为60、30、20等等

(关于和中vsync的一些信息)

第二种常用的方法(可选添加vsync)是不限制帧速率。相反,调整代码以处理差异。从长远来看,这要灵活得多,而且总体上更好地编码,IMO,而且比强制执行特定的FPS计数要简单得多

假设您有一个简单的渲染循环,它开始看起来像:

while ( gameloop )
{
    float framedelta = ( timeNow - timeLast )
    timeLast = timeNow;

    for each ( GameObject object in World )
    {
        object->Animate(framedelta);
        object->Move(speed * framedelta)
    }

    render();
}

您需要查看时差/经过的时间/增量,然后从那里开始工作。允许帧速率根据硬件和设置进行缩放(有太多的变化,您甚至无法预测或处理一半的变化),并使您的游戏能够使用它,而不是控制它。对你来说更容易,在实践中更灵活、更稳定

下面的伪代码描述了产生可预测(如果不是恒定的话)帧速率(视频或3D图形)的典型方法

算法

  • 准备下一帧(在后缓冲区中渲染)
  • 在剩余的时间段睡眠
  • 要求显示帧(交换前后缓冲区)
  • 注意睡眠操作的位置。它夹在同一帧的准备和显示之间。这是恒定帧速率的主要关键!您希望帧的准备工作计入显示帧的总时间片

    关于如何实现这些步骤中的每一步(根据分辨率、可靠性等选择睡眠操作),有许多变体,但核心就在这里

    额外可靠性提示

    • 在整个时间间隔内,不要调用睡眠函数一次。定义一个常数,其中包含您准备接受的最大错误,并在此间隔内重复睡眠一段时间,直到剩余时间小于或等于此值
    • 当你知道自己无法及时准备下一帧时,不要害怕偶尔掉下一帧。跳过一帧在视觉上比产生可变帧速率更吸引人
    • 如果可以避免单处理器系统上的后台线程,请避免它们。使用工作线程会真正破坏睡眠功能的可靠性。最好的方法是把你的背景工作分成小块,让这些工作执行,而不是睡觉
    第一个很容易实现,可以隐藏在助手函数中。第二个是有点敏感,因为它需要你保持平均渲染速度的统计数据,以及其他一些东西。第三种方法很难实现,因为通常很难预测不同的任务需要多少时间。它通常只在具有硬约束的实时系统中实施。

    可能重复: