[译]GLUT教程 - 每秒帧数

Lighthouse3d.com >> GLUT Tutorial >> Extras >> Frames per Second

 

你的程序实际上跑得多快? 有时我们我们改了一个小地方却不确定效果有没有表现出来,即它们如何影响每秒显示的帧数.本节我们会来看怎么使用GLUT来计算出每秒的帧数.注意这不能看作是真是测试数据,它只是个参考值.

GLUT提供一个函数来查询系统中的很多特性,其中之一是获取调用glutInit函数时使用的毫秒数.该函数是glutGet,原型如下:

 

int glutGet(GLenum state);

state - 指定我们需要的值

 

该函数可以用于很多方面,例如获取窗体坐标或者获取OpenGL的缓冲深度.本节我们用它来获取调用glutInit函数时使用的毫秒数,保存在GLUT_ELAPSED_TIME传参中.

 

int time;

...

time = glutGet(GLUT_ELAPSED_TIME);

 

现在用该函数来计算程序每秒的帧数.帧与帧之间的速率是变化的,因为并非所有帧都用相同的渲染时间,因为操作系统不是只有你的程序在运行.操作系统取得它的通行权,然后镜头随着渲染的物体而改变.因此我们将会避免计算每一帧的速率,而去计算每秒大概的帧数.这样会提供一个更精确的数值,虽然它也仍然只是一个均值.

先声明三个变量: frame, time和timebase, 其中timebase和frame初始化为0.

int frame=0,time,timebase=0;

这三个变量作用是:

frame - 我们从开始统计帧速率到现在的帧数

time - 当然的毫秒数

timebase - 我们从开始统计帧速率到现在的时间

 

下面这段代码,只要放到空闲事件的处理函数中,就会实现上述效果:

...

    frame++;
    time=glutGet(GLUT_ELAPSED_TIME);

    if (time - timebase > 1000) {
        fps = frame*1000.0/(time-timebase));
         timebase = time;
        frame = 0;
    }
    ...

 

我们从增加帧数开始,例如增加各种帧.然后记录当前事件.然后我们对比timebase来检查读秒,例如看time和timebase是否相差1000毫秒.如果还未到时间,会先跳过计算部分.然而即使超过了1秒,我们也会进行计算.

从time和timebase的差是提供了开始统计帧数到停止所经过的毫秒数.该值除以1000就是所经过的秒数.剩下要做是把该秒数值乘以从开始统计帧数到停止所渲染的帧数,就得到了每秒的帧数.最后我们重置timebase到当前的毫秒值,把frame置零.

注意,如果程序的timebase为0,就要先等1秒来等待初始化该值.一开始的初始值会有误导,因为该值里面包含了初始化窗体消耗的时间.你测试一下就会发现该值会远比实际帧速率低.

如果你想输出每秒的帧数,你可以使用以下代码:

    ...
    frame++;
    time=glutGet(GLUT_ELAPSED_TIME);
    if (time - timebase > 1000) {
        sprintf(s,"FPS:%4.2f",
            frame*1000.0/(time-timebase));
        timebase = time;
        frame = 0;
    }

    glColor3f(0.0f,1.0f,1.0f);

    glPushMatrix();
    glLoadIdentity();
    setOrthographicProjection();
    renderBitmapString(30,35,(void *)font,s);
    glPopMatrix();
    restorePerspectiveProjection();

    ...

 

posted @ 2013-10-29 11:02  Clotho_Lee  阅读(6161)  评论(0编辑  收藏  举报