简述FPS的计算方法
FPS是Frame per second的缩写,即每秒的帧数.这一术语广泛的应用于计算机图形学,视频采集,游戏等。
这里主要介绍一下视频游戏中的帧率,第一个First person shooter game的帧率只有大概6FPS,但是依然很成功。不过随着硬件设备,尤其是显卡性能的加强,现在游戏的帧率一般在30FPS~100FPS之间。由于每帧图像所消耗的时间不一样,造成帧率是在不断变化的,所以每个游戏都会设定一个最大的帧率,以保证平滑的切换。
下面就以一段QT中的代码介绍一下帧率的计算。
// Timing...
static QTime time;
static int frames = 0;
static bool started = false;
if (!started || time.elapsed() > 1000) {
qreal fps = frames * 1000. / time.elapsed();
if (fps == 0)
m_current_fps = "counting fps...";
else
m_current_fps = QString::fromLatin1("%3 FPS").arg((int) qRound(fps));
time.start();
started = true;
frames = 0;
} else {
++frames;
p.setOpacity(1);
p.setFont(QFont("times", 30));
p.fillRect(5, height() - 40, 250, 40, Qt::white);
p.drawText(10, height() - 8, m_current_fps);
}
}
static QTime time;
static int frames = 0;
static bool started = false;
if (!started || time.elapsed() > 1000) {
qreal fps = frames * 1000. / time.elapsed();
if (fps == 0)
m_current_fps = "counting fps...";
else
m_current_fps = QString::fromLatin1("%3 FPS").arg((int) qRound(fps));
time.start();
started = true;
frames = 0;
} else {
++frames;
p.setOpacity(1);
p.setFont(QFont("times", 30));
p.fillRect(5, height() - 40, 250, 40, Qt::white);
p.drawText(10, height() - 8, m_current_fps);
}
}
由于一般实时的游戏都已一个定时器不断地刷新画面,所以每一帧的输出都是通过paintEvent来完成的。将上面这段代码放入paintEvent就可以统计出每秒的帧率。
那么怎么控制最大的帧率呢?
其实也很简单,就是通过设置定时器的interval来完成的,考虑到现在显示器的显示频率一般在60HZ,所以interval一般设置为1000/60ms 比较好,即60FPS是一个理论上最大的帧率。