Непостоянная анимация SDL + OpenGL при включенном vsync - PullRequest
2 голосов
/ 03 июня 2011
Uint32 prev = SDL_GetTicks();

while ( true )
{
    Draw();

    Uint32 now = SDL_GetTicks();
    Uint32 delta = now - prev;
    printf( "%u\n" , delta );
    Update( delta / 1000.0f );
    prev = now;

    ProcessEvents();
}

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

[...]
16
15
16
66 #
2  #
0  #
0  #
16
16
21
[...]

Я знаю, что есть несколько проблем с этим типом цикла, но ни одна из них, кажется, не относится к этому простому примеру (я не прав?).В чем причина такого поведения и как я могу его преодолеть?

Я использую карту ATI в системе Linux, но я ожидаю портативного объяснения / решения.

1 Ответ

1 голос
/ 04 июня 2011

Кажется, это был недостаток glFinish(), я где-то читал, что вызовы этой функции в большинстве случаев бесполезны (например, здесь или здесь ). Ну, я, возможно, неправильно понимаю некоторые фундаментальные концепции, но это сработало для меня, и теперь функция Draw() заканчивается на:

    [...]
    glFinish();
    SDL_GL_SwapBuffers();
}
...