OpenGL系统设计——求帧速度
2016-01-10 21:41
489 查看
转载地址 /article/9112429.html
帧速率也是一个熟悉的话题,帧速率通常指动画运行时每秒的帧数。对于相同的应用来说,帧速率通常是衡量计算机性能高低的一个指标,特别是显卡。而很多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。通过这个程序也可以看到,当处于全屏模式时,程序运行的的确要快一些,当然在我们这个简单的程序中并不那么明显。
顶0
帧速率也是一个熟悉的话题,帧速率通常指动画运行时每秒的帧数。对于相同的应用来说,帧速率通常是衡量计算机性能高低的一个指标,特别是显卡。而很多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。通过这个程序也可以看到,当处于全屏模式时,程序运行的的确要快一些,当然在我们这个简单的程序中并不那么明显。
顶0
相关文章推荐
- storm的作业单元:Topology
- 用opencsv文件读写CSV文件
- windows apache 配置多个服务站点
- Linux chmod命令具体解释
- Openwrt 硬改过程记录
- 阿岳之_linux信息安全_SSL,PKI,CA篇
- OpenLDAP安装
- storm topology优化之lib库分离
- 解析文档的开源jar包 Apache Tika
- CodeForces 611D New Year and Ancient Prophecy
- VS2010中配置opencv详细过程
- C#网站部署后提示App_Code.w3o10pfm.dll拒绝访问
- Linux的SOCKET编程详解
- linux学习(一)
- storm系统架构学习
- OpenGL绘制多边形边框线
- Linux内存管理图解
- Linux gprof命令
- 实战KVM|kvm安装|创建linux|控制台|克隆
- CentOS5.8 RHCS配置