0

对于 FPS 计算,我使用了我在网上找到的一些代码,它运行良好。但是,我真的不明白。这是我使用的功能:

void computeFPS()
{
  numberOfFramesSinceLastComputation++;
  currentTime = glutGet(GLUT_ELAPSED_TIME);

  if(currentTime - timeSinceLastFPSComputation > 1000)
  {
    char fps[256];
    sprintf(fps, "FPS: %.2f", numberOfFramesSinceLastFPSComputation * 1000.0 / (currentTime . timeSinceLastFPSComputation));
    glutSetWindowTitle(fps);
    timeSinceLastFPSComputation = currentTime;
    numberOfFramesSinceLastComputation = 0;
  }
 }

我的问题是,在 sprint 调用中计算的值是如何存储在 fps 数组中的,因为我并没有真正分配它。

4

2 回答 2

3

这不是关于 OpenGL 的问题,而是关于 C 标准库的问题。阅读 s(n)printf 的参考文档有助于:

人 s(n)printf: http: //linux.die.net/man/3/sprintf

简而言之,snprintf 采用指向用户提供的缓冲区和格式字符串的指针,并根据格式字符串和附加参数中给出的值填充缓冲区。


这是我的建议:如果您必须询问此类问题,请先不要处理 OpenGL。在提供缓冲区对象数据和着色器源时,您需要熟练使用指针和缓冲区。如果您打算为此使用 C,请先获取一本有关 C 的书并彻底了解它。与 C++ 不同的是,您实际上可以在几个月的时间内将 C 学习到一定程度。

于 2013-01-30T21:00:48.320 回答
1

据说在主循环的每次重绘时都会调用此函数(对于每一帧)。所以它正在做的是增加帧计数器并获取显示该帧的当前时间。每秒一次(1000 毫秒),它会检查该计数器并将其重置为 0。因此,当每秒获取计数器值时,它会获取其值并将其显示为窗口的标题。

/**
 * This function has to be called at every frame redraw.
 * It will update the window title once per second (or more) with the fps value.
 */
void computeFPS()
{
  //increase the number of frames
  numberOfFramesSinceLastComputation++;

  //get the current time in order to check if it has been one second
  currentTime = glutGet(GLUT_ELAPSED_TIME);

  //the code in this if will be executed just once per second (1000ms)
  if(currentTime - timeSinceLastFPSComputation > 1000)
  {
    //create a char string with the integer value of numberOfFramesSinceLastComputation and assign it to fps
    char fps[256];
    sprintf(fps, "FPS: %.2f", numberOfFramesSinceLastFPSComputation * 1000.0 / (currentTime . timeSinceLastFPSComputation));

    //use fps to set the window title
    glutSetWindowTitle(fps);

    //saves the current time in order to know when the next second will occur
    timeSinceLastFPSComputation = currentTime;

    //resets the number of frames per second.
    numberOfFramesSinceLastComputation = 0;
  }
 }
于 2013-01-30T21:08:43.507 回答