在实时图形处理中,关注性能是非常重要的。一个好的做法是选择一个目标FPS(通常是60或30),并尽可能地让它达到这个目标。
FPS计数器看起来像这样:
double lastTime = glfwGetTime();
int nbFrames = 0;
do{
// Measure speed
double currentTime = glfwGetTime();
nbFrames++;
if ( currentTime - lastTime >= 1.0 ){ // If last prinf() was more than 1 sec ago
// printf and reset timer
printf("%f ms/frame\n", 1000.0/double(nbFrames));
nbFrames = 0;
lastTime += 1.0;
}
... rest of the main loop
这段代码中有一个奇怪的现象。它显示的是绘制一帧所需的时间(以毫秒为单位,在1秒内取平均值),而不是在过去的一秒钟内绘制了多少帧。
实际上,这样做更好。不要依赖FPS(每秒帧数)。因为每秒帧数=1/每帧秒数,这是一个反比关系,而我们人类并不擅长理解这种关系。让我们来看一个例子。
你编写了一个出色的渲染函数,运行速度为1000 FPS(每帧1毫秒)。但是你在着色器中遗漏了某些计算成本,假设这额外增加了0.1毫秒的成本。然后,突然之间,1/0.0011 = 900。你就这样失去了100 FPS。所以最好不要使用FPS来进行性能分析。
如果你打算制作一个60fps的游戏,你的目标应该是16.6666毫秒;如果你打算制作一个30fps的游戏,你的目标应该是33.3333毫秒。这就是你需要知道的全部内容。
此代码在从OpenGL教程系列(第九课:VBO索引)开始的所有教程中都可使用;详见教程系列源码中的tutorial09_vbo_indexing/tutorial09.cpp。其他性能工具可在工具-调试器中找到。