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=,time,timebase=;

这三个变量作用是:

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

time - 当然的毫秒数

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

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

...

    frame++;
time=glutGet(GLUT_ELAPSED_TIME); if (time - timebase > ) {
fps = frame*1000.0/(time-timebase));
timebase = time;
frame = ;
}
...

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

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

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

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

    ...
frame++;
time=glutGet(GLUT_ELAPSED_TIME);
if (time - timebase > ) {
sprintf(s,"FPS:%4.2f",
frame*1000.0/(time-timebase));
timebase = time;
frame = ;
} glColor3f(0.0f,1.0f,1.0f); glPushMatrix();
glLoadIdentity();
setOrthographicProjection();
renderBitmapString(,,(void *)font,s);
glPopMatrix();
restorePerspectiveProjection(); ...

[译]GLUT教程 - 每秒帧数的更多相关文章

  1. [译]GLUT教程(目录)

    http://www.lighthouse3d.com/tutorials/glut-tutorial/ GLUT是OpenGL Utility Toolkit的意思.作者Mark J. Kilgar ...

  2. [译]GLUT教程 - 整合代码5

    Lighthouse3d.com >> GLUT Tutorial >> Extras >> The Code So Far V 该代码与位图字体的代码类似.区别是 ...

  3. [译]GLUT教程 - 位图和正交投影视图

    Lighthouse3d.com >> GLUT Tutorial >> Fonts >> Bitmap Fonts and Orthogonal Projecti ...

  4. [译]GLUT教程 - 游戏模式

    Lighthouse3d.com >> GLUT Tutorial >> Extras >> Game Mode 根据GLUT官网的说明,GLUT的游戏模式是为开启 ...

  5. [译]GLUT教程 - glutPostRedisplay函数

    Lighthouse3d.com >> GLUT Tutorial >> Avoiding the Idle Func >> glutPostRedisplay 直 ...

  6. [译]GLUT教程 - 鼠标

    Lighthouse3d.com >> GLUT Tutorial >> Input >> The Mouse 上一节我们讨论了怎么用GLUT的键盘函数跟OpenG ...

  7. [译]GLUT教程 - 移动镜头1

    Lighthouse3d.com >> GLUT Tutorial >> Input >> Move the Camera I 下面来看一个更有趣的GLUT应用.本 ...

  8. [译]GLUT教程 - 动画

    Lighthouse3d.com >> GLUT Tutorial >> Basics >> Animation 前面章节我们已经创建了一个白色三角形的窗体.还没到 ...

  9. [译]GLUT教程 - 安装

    Lighthouse3d.com >> GLUT Tutorial >> Basics >> Setup 你需要什么 要用GLUT库开发程序,你可以下载最新版本3. ...

随机推荐

  1. Activator常用方法

    1.获取图片 public static Image getImage(String key) {        Image img = getDefault().getImageRegistry() ...

  2. Python的功能模块[0] -> wmi -> 获取 Windows 内部信息

    wmi模块 / wmi Module WMI (Windows Management Instrumentation) 模块可用于获取 Windows 内部信息.该模块需要 win32com 的支持, ...

  3. 背包【p1858】 多人背包(次优解 or 第k优解)

    题目描述--->p1858 多人背包 分析: 很明显,这题是背包问题的一种变形. 求解 次优解or第k优解. 表示刚开始有点懵,看题解也看不太懂. 又中途去补看了一下背包九讲 然后感觉有些理解, ...

  4. ELK帮助文档

    elasticsearch: API中文指南:https://es.xiaoleilu.com/010_Intro/15_API.html 官方文档:https://www.elastic.co/cn ...

  5. 2.3多线程(java学习笔记)synchronized关键字

    一.为什么要用synchronized关键字 首先多线程中多个线程运行面临共享数据同步的问题. 多线程正常使用共享数据时需要经过以下步骤: 1.线程A从共享数据区中复制出数据副本,然后处理. 2.线程 ...

  6. dubbo的中文官网

    https://dubbo.gitbooks.io/dubbo-user-book/content/preface/background.html

  7. SQL语句原理与高效SQL语句(转)

    做软件开发的programers,大部分都离不开跟数据库打交道,特别是erp开发的,跟数据库打交道更是频繁,存储过程动不动就是上千行,如果数据量大,人员流动大,那么还能保证下一段时间系统还能流畅的运行 ...

  8. Incorrect key file for table '/tmp/#sql_46fd_0.MYI'; try to repair it

    当查询数量很大时,(我的数据库70万数据),会导致这个错误,这是MYSQL中的一个bug. 解决方法 :   1. 修复表 check table tablename. 查看表的状态.如果有错误,则需 ...

  9. Swift入门(一)——基本的语法

    近期開始学习swift.把学习的过程和总结整理成一个系列.方便日后回想总结. 基本的语法 基础语法 swift中每一行结束后不须要加分号.多个语句在同一行内须要用分好隔开 //表示凝视.或者用/* - ...

  10. QQ-weiyun(微云)-云储存

    ylbtech-DatabaseDesgin:QQ-weiyun(微云)-云储存 1.A,数据库关系图(Database Diagram) -- =========================== ...