[译]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=,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教程 - 每秒帧数的更多相关文章
- [译]GLUT教程(目录)
http://www.lighthouse3d.com/tutorials/glut-tutorial/ GLUT是OpenGL Utility Toolkit的意思.作者Mark J. Kilgar ...
- [译]GLUT教程 - 整合代码5
Lighthouse3d.com >> GLUT Tutorial >> Extras >> The Code So Far V 该代码与位图字体的代码类似.区别是 ...
- [译]GLUT教程 - 位图和正交投影视图
Lighthouse3d.com >> GLUT Tutorial >> Fonts >> Bitmap Fonts and Orthogonal Projecti ...
- [译]GLUT教程 - 游戏模式
Lighthouse3d.com >> GLUT Tutorial >> Extras >> Game Mode 根据GLUT官网的说明,GLUT的游戏模式是为开启 ...
- [译]GLUT教程 - glutPostRedisplay函数
Lighthouse3d.com >> GLUT Tutorial >> Avoiding the Idle Func >> glutPostRedisplay 直 ...
- [译]GLUT教程 - 鼠标
Lighthouse3d.com >> GLUT Tutorial >> Input >> The Mouse 上一节我们讨论了怎么用GLUT的键盘函数跟OpenG ...
- [译]GLUT教程 - 移动镜头1
Lighthouse3d.com >> GLUT Tutorial >> Input >> Move the Camera I 下面来看一个更有趣的GLUT应用.本 ...
- [译]GLUT教程 - 动画
Lighthouse3d.com >> GLUT Tutorial >> Basics >> Animation 前面章节我们已经创建了一个白色三角形的窗体.还没到 ...
- [译]GLUT教程 - 安装
Lighthouse3d.com >> GLUT Tutorial >> Basics >> Setup 你需要什么 要用GLUT库开发程序,你可以下载最新版本3. ...
随机推荐
- Django REST framework(官方说明文档翻译)(1快速开始 )
http://www.django-rest-framework.org/tutorial/quickstart/ 第一部分:快速开始 我们将创建一个简单的api接口,用来给admin用户查看及编辑系 ...
- Python的并发并行[1] -> 线程[2] -> 锁与信号量
锁与信号量 目录 添加线程锁 锁的本质 互斥锁与可重入锁 死锁的产生 锁的上下文管理 信号量与有界信号量 1 添加线程锁 由于多线程对资源的抢占顺序不同,可能会产生冲突,通过添加线程锁来对共有资源进行 ...
- Spring Cloud 微服务架构解决方案
1 理解微服务 1.1 软件架构演进 软件架构的发展经历了从单体结构.垂直架构.SOA架构到微服务架构的过程. 1.1.1 单体架构 特点: 1.所有的功能集成在一个项目工程中. 2.所有的功能打一个 ...
- ARC 098 D - Xor Sum 2
Problem Statement There is an integer sequence A of length N. Find the number of the pairs of intege ...
- Volley缓存说明——一个请求两次回调
从上一篇文章Android 异步网络请求框架-Volley了解volley的一些出来过程,当然也包含网络请求和缓存处理的流程,但是在此需要单独做一些说明. 我在使用过程中忽略了一个事情,就是一个网络请 ...
- 安装docker-compose的两种方式
这里简单介绍下两种安装docker-compose的方式,第一种方式相对简单,但是由于网络问题,常常安装不上,并且经常会断开,第二种方式略微麻烦,但是安装过程比较稳定 方法一: # curl -L h ...
- YOLO 测试出错:段错误 (核心已转储)
段错误 (核心已转储): data/voc.names中文标签改成英文
- Java 数字签名原理及产生
数字签名与数字证书 关于数字签名的介绍可以参考以上这篇. 这里稍微说一下不对称加密的方式: 用公钥加密的内容只能用私钥解密,用私钥加密的内容只能用公钥解密. 这样比对称加密更安全 Java 中数字签名 ...
- oracle调优 浅析“会话管理开销”
调优之浅析"会话管理开销" [简单介绍] 在调优的过程中,对于会话的管理是比較普遍的问题,由于维护会话的开销相对是比較高的. [过程表现例如以下] ...
- 【转】VirtualBox网卡设置
原文: https://blog.csdn.net/jwpker/article/details/45870903 ------------------------------------------ ...