对于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数组中,因为我没有真正分配它。
答案 0 :(得分:3)
这不是关于OpenGL的问题,而是C标准库。阅读s(n)printf的参考文档有助于:
man s(n)printf:http://linux.die.net/man/3/sprintf
简而言之,snprintf接受一个指向用户提供的缓冲区和格式字符串的指针,并根据格式字符串和附加参数中给出的值填充缓冲区。
这是我的建议:如果你不得不问这样的事情,还不要解决OpenGL问题。在提供缓冲区对象数据和着色器源时,您需要熟练使用指针和缓冲区。如果您计划使用C语言,请获取有关C语言的书籍并首先全面了解。与C ++不同的是,你可以在几个月的时间内学到很好的学习成绩。
答案 1 :(得分:1)
这个函数应该在主循环的每次重绘时调用(对于每一帧)。所以它正在做的是增加帧的计数器并获得显示该帧的当前时间。每秒一次(1000ms),它会检查计数器并将其重置为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;
}
}