Ich habe eine Anwendung mit XCB und openGL. Zu Beginn wähle ich eine Framebuffer-Konfiguration mit den folgenden Attributen:GLX Animation langsamer als erwartet
const int attributes[] = {GLX_BUFFER_SIZE, 32, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, True, GLX_RENDER_TYPE, GLX_RGBA_BIT, None};
fb_configs = glXChooseFBConfig(display, screen_index, attributes, &fb_configs_count);
Ich betreiben eine einfache Animation, die angeblich eine feste Dauer (1 s) dauern, aber es auf dem Bildschirm dauert viel länger, zeige (ca. 5 s). Nach dem Hinzufügen von Protokollen, um den Wert des Fortschritts anzuzeigen, fand ich heraus, dass die tatsächliche Schleife nur 1s dauert.
struct timeval start; // start time of the animation
gettimeofday(&start, 0);
while (1)
{
double progress = timer_progress(&start);
if (progress > 1.0)
break; // end the animation
draw(progress);
glXSwapBuffers(display, drawable);
xcb_generic_event_t *event = xcb_poll_for_event(connection);
if (!event)
{
usleep(1000);
continue;
}
switch (event->response_type & ~0x80)
{
case XCB_EXPOSE:
default:
free(event);
continue;
}
}
Ich bin nicht sicher, was wirklich los ist. Ich nehme an, dass bei jeder Iteration glXSwapBuffers()
die OpenGL-Befehle für das Zeichnen in die Warteschlange gestellt werden und die meisten davon noch ausgeführt werden müssen, wenn die Schleife vorbei ist.
Die Optimierung des Parameters usleep()
hat keinen anderen Effekt, als die Animation weniger weich zu machen oder die Animation viel langsamer zu machen. Das Problem verschwindet, wenn ich zu einer einzelnen Pufferung umschalte (aber ich bekomme die Probleme, die mit einer einzelnen Pufferung verbunden sind).
Es scheint, dass ich etwas nicht richtig mache, aber ich habe keine Ahnung was.
Ich verwende Verzögerungen nur, um die Ziehgeschwindigkeit zu begrenzen. 'timer_progress()' gibt die Zeit zurück, die seit 'start' vergangen ist und' draw() 'verwendet diesen Wert. – martinkunev