C++ 什么';控制帧速率的常用方法是什么?
我是图形新手,所以我不知道人们通常如何控制渲染的帧速率。 我的意思是,如何将应用程序设置为以30fps的速度渲染? 可能有很多API提供这样的功能,但我需要从头开始编写。有两种“常用”的“控制”帧速率的方法,但都不是那么简单 这两个控件中的第一个也是更多的控件,通常是可选的,是VSync。这将强制视频卡在显示器刷新完成时仅推出新帧。许多监视器刷新频率为60 Hz,因此您往往会获得60 FPS 这可以很好地限制帧速率以监视刷新率,但当帧速率下降到刷新率以下时,它将被强制到下一个倍数。因此,当帧速率开始下降时,您会损失相当多的潜在渲染时间,因为它被强制为60、30、20等等 (关于和中vsync的一些信息) 第二种常用的方法(可选添加vsync)是不限制帧速率。相反,调整代码以处理差异。从长远来看,这要灵活得多,而且总体上更好地编码,IMO,而且比强制执行特定的FPS计数要简单得多 假设您有一个简单的渲染循环,它开始看起来像:C++ 什么';控制帧速率的常用方法是什么?,c++,graphics,C++,Graphics,我是图形新手,所以我不知道人们通常如何控制渲染的帧速率。 我的意思是,如何将应用程序设置为以30fps的速度渲染? 可能有很多API提供这样的功能,但我需要从头开始编写。有两种“常用”的“控制”帧速率的方法,但都不是那么简单 这两个控件中的第一个也是更多的控件,通常是可选的,是VSync。这将强制视频卡在显示器刷新完成时仅推出新帧。许多监视器刷新频率为60 Hz,因此您往往会获得60 FPS 这可以很好地限制帧速率以监视刷新率,但当帧速率下降到刷新率以下时,它将被强制到下一个倍数。因此,当帧速率
while ( gameloop )
{
float framedelta = ( timeNow - timeLast )
timeLast = timeNow;
for each ( GameObject object in World )
{
object->Animate(framedelta);
object->Move(speed * framedelta)
}
render();
}
您需要查看时差/经过的时间/增量,然后从那里开始工作。允许帧速率根据硬件和设置进行缩放(有太多的变化,您甚至无法预测或处理一半的变化),并使您的游戏能够使用它,而不是控制它。对你来说更容易,在实践中更灵活、更稳定 下面的伪代码描述了产生可预测(如果不是恒定的话)帧速率(视频或3D图形)的典型方法 算法
- 在整个时间间隔内,不要调用睡眠函数一次。定义一个常数,其中包含您准备接受的最大错误,并在此间隔内重复睡眠一段时间,直到剩余时间小于或等于此值
- 当你知道自己无法及时准备下一帧时,不要害怕偶尔掉下一帧。跳过一帧在视觉上比产生可变帧速率更吸引人
- 如果可以避免单处理器系统上的后台线程,请避免它们。使用工作线程会真正破坏睡眠功能的可靠性。最好的方法是把你的背景工作分成小块,让这些工作执行,而不是睡觉