帧速率也是一个熟悉的话题,帧速率通常指动画运行时每秒的帧数。对于相同的应用来说,帧速率通常是衡量计算机性能高低的一个指标,特别是显卡。而很多OpenGL的应用由于涉及到3D处理,纹理贴图等,更可以检验显卡性能的高低。正因为如此,从Quake、Quake2到Quake3一直都是发烧友测试机器和显卡性能的工具之一。
事实上,只要在程序中加入一个简单的几行代码就可以实现帧速率的测试功能了。
TCHAR szFPS[MAX_LOADSTRING]; //表示帧速率字符串
void CalculateFrameRate()
{
static float framesPerSecond = 0.0f; //帧计数器
static float lastTime = 0.0f;
//将毫秒转换成秒
float currentTime = GetTickCount() * 0.001f;
// 累加帧计数器
++framesPerSecond;
// 如果当前时间和上次记录的时间差大于1秒
if( currentTime - lastTime > 1.0f )
{
//将上一次的记录时间设成当前时间
lastTime = currentTime;
//记入szFPS全局变量
sprintf(szFPS, "Current Frames Per Second: %d", int(framesPerSecond));
// 对帧计数器进行复位
framesPerSecond = 0;
}
}
int glMain(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(-0.5, -0.5, -3.5);
//使用这种方法取代前面的通过WM_KEYDOWN消息带的wParam来判断键盘消息
if(keys[VK_ESCAPE]) //ESC键退出
return FALSE;
if (keys[VK_F1]) //F1键切换窗口模式
{
keys[VK_F1]=FALSE;
glShutdown();
fullscreen=!fullscreen;
if (!InitInstance(WIDTH, HEIGHT, BITS))
{
return 0;
}
}
//绘制1000个三角形
for(int i=0; i<1000; i++)
{
glBegin(GL_TRIANGLES);
glColor3ub(rand()%256, rand()%256, rand()%256);
glVertex3s(rand()%3, rand()%3, 0);
glColor3ub(rand()%256, rand()%256, rand()%256);
glVertex3s(rand()%3, rand()%3, 0);
glColor3ub(rand()%256, rand()%256, rand()%256);
glVertex3s(rand()%3, rand()%3, 0);
glEnd();
}
CalculateFrameRate();
glColor3f(1.0, 0.0, 0.0);
glRasterPos2f(-1.0f, 0.35f);
glPrint(g_Base, szFPS);
SwapBuffers(g_hDC);
return TRUE;
}
程序运行效果如图11-2所示,在320X240X16位色的窗口模式下,在PIII 866的机器上帧速率基本稳定在22左右,在全屏模式下稳定在23。通过这个程序也可以看到,当处于全屏模式时,程序运行的的确要快一些,当然在我们这个简单的程序中并不那么明显。