0

gettimeofdayを使用して、ゲームループを特定のFPSにクランプしようとしています。これは非常に初歩的なゲームなので、私の処理能力をすべてかみ砕き続けます。

FRAMES_PER_SECONDをどれだけ低く設定しても、可能な限り高速に実行しようとし続けます。

私はdeWiTTERSがゲームループについて何を言っているかについてかなり良いハンドルを手に入れましたが、私はMacを使用しているGetTickCount b/cの代わりにgettimeofdayを使用しています。

また、私は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関数を複数の場所に配置しようとしましたが、それらのスイートスポットが見つからないようです(コードが正しい場合でも)。

4

3 に答える 3

4

それは一度だけ呼び出されます。glutMainLoopは二度と戻らないので、FPSロジックを表示機能の中に入れる必要があります。(これは、whileループが不要であることも意味します。)

編集:またはおそらくそれはあなたのアイドル関数の中に入るはずです。グルトを使ってから久しぶりです。

于 2012-07-11T19:59:49.067 に答える
0

glutMainLoop()

glutMainLoopGLUTイベント処理ループに入ります。このルーチンは、GLUTプログラムで最大1回呼び出す必要があります。一度呼び出されると、このルーチンは決して戻りません。登録されているコールバックを必要に応じて呼び出します。

于 2012-07-11T20:04:18.533 に答える
0

next_game_tickから初期化した時点では、elapsed_timeまだ初期化されていませんelapsed_time

于 2012-07-11T20:04:33.000 に答える