我试图通过使用gettimeofday将游戏循环限制在特定的FPS上。这是一个非常基本的游戏,因此它不断消耗着我所有的处理能力。
无论我将FRAMES_PER_SECOND设置为多低,它都会继续尝试以最快的速度运行。
我对deWiTTERS关于游戏循环的说法有很好的了解,但是我使用的是gettimeofday而不是Mac上的GetTickCount b / c。
另外,我正在运行OSX并使用C ++,GLUT。
这是我的主要样子:
int main (int argc, char **argv)
{
while (true)
{
timeval t1, t2;
double elapsedTime;
gettimeofday(&t1, NULL); // start timer
const int FRAMES_PER_SECOND = 30;
const int SKIP_TICKS = 1000 / FRAMES_PER_SECOND;
double next_game_tick = elapsedTime;
int sleep_time = 0;
glutInit (&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize (windowWidth, windowHeight);
glutInitWindowPosition (100, 100);
glutCreateWindow ("A basic OpenGL Window");
glutDisplayFunc (display);
glutIdleFunc (idle);
glutReshapeFunc (reshape);
glutPassiveMotionFunc(mouseMovement); //check for mouse movement
glutMouseFunc(buttonPress); //check for button press
gettimeofday(&t2, NULL); // stop timer after one full loop
elapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0; // compute sec to ms
elapsedTime += (t2.tv_usec - t1.tv_usec) / 1000.0; // compute us to ms
next_game_tick += SKIP_TICKS;
sleep_time = next_game_tick - elapsedTime;
if( sleep_time >= 0 )
{
sleep( sleep_time );
}
glutMainLoop ();
}
}
我试图将我的gettimeofday和sleep函数放置在多个位置,但是我似乎找不到它们的最佳选择(假设我的代码正确)。
最佳答案
那只会被调用一次。我相信您需要将FPS逻辑放入显示函数中,因为glutMainLoop永远不会返回。 (这也意味着不需要您的while循环。)
编辑:或更可能它应该在您的空闲函数内。自从我使用过剩食品已有一段时间了。
关于c++ - 用gettimeofday固定FPS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11440434/