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是一个理论上最大的帧率。