Вертикальная синхронизация OpenGL ускоряет рендеринг - PullRequest
0 голосов
/ 18 декабря 2011

Я заметил, что когда я рендерил простой примитив, такой как вращающийся куб, и увеличивал угол на 0,1 при каждом проходе через традиционный цикл while (! Done), я получаю результат, когда включена вертикальная синхронизация, и когдавыкл (как изменилось в моей панели управления nVidia) резко отличается с точки зрения скорости.

Например, я использую следующий код:

while (!done)
{
    PeekMessage(&msg, hWnd, NULL, NULL, PM_REMOVE);

    if (msg.message == WM_QUIT)
    {
        done = true;
    }
    else
    {
        angle += 0.1;

        if (angle >= 360.0)
        {
            angle = 0.0;
        }

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();         

        glTranslatef(0.0f, 0.0f, -5.0f);

        glPushMatrix();
            glRotatef(angle, 1.0f, 0.0f, 0.0f);
            glRotatef(angle, 0.0f, 1.0f, 0.0f);
            glColor3f(1.0f, 0.0f, 0.0f);
            glutSolidCube(2.0f);
        glPopMatrix();

        glFlush();
        SwapBuffers(hDC);

        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

Когда вертикальная синхронизация отключена, этокуб вращается намного быстрее, чем при включенной вертикальной синхронизации.Теперь в играх FPS блокируется до 60 кадров в секунду, когда включена вертикальная синхронизация, и может свободно прыгать так высоко, как позволяет ваш монитор, когда он отключен.Вероятно, это как-то связано с этим.

Я легко могу решить эту проблему, увеличив или уменьшив угол с каждым проходом, есть ли способ заставить мой куб вращаться одинаково, несмотря на включение или выключение vsync

1 Ответ

5 голосов
/ 18 декабря 2011

Да, используйте дельту времени.Вместо того, чтобы вращать 0,1 в каждом кадре, вы хотите вращать 0,1 каждые 20 мс или что-то.Таким образом, он будет вращаться с одинаковой скоростью независимо от частоты кадров.

angle += 0.1 * time_elapsed_since_last_tick * some_factor;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...