XCB 및 OpenGL을 사용하는 응용 프로그램이 있습니다. 처음에는, 나는 다음과 같은 속성을 가지는 프레임 버퍼 구성을 선택합니다 GLX 애니메이션이 예상보다 느립니다.
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);
내가 고정 된 시간 (초)을 지속하도록되어 간단한 애니메이션을 실행하지만, 화면에 보여주는 것은 5 초에 대해 (더 오래 걸립니다). 로그를 추가하여 진행의 가치를 보여 주면 실제 루프가 1 초만 지속된다는 것을 알게되었습니다.
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;
}
}
무엇이 실제로 일어나고 있는지 잘 모르겠습니다. 각 반복마다 가정합니다. glXSwapBuffers()
은 드로잉을 위해 OpenGL 명령을 대기열에 추가하고 대부분 루프가 끝나면 아직 실행되지 않습니다.
usleep()
의 매개 변수를 조정하면 애니메이션이 부드럽게 처리되지 않거나 애니메이션이 훨씬 느려지는 것 외에는 아무런 효과가 없습니다. 단일 버퍼링으로 전환하면 문제가 사라집니다 (그러나 단일 버퍼링과 관련된 문제가 발생합니다).
내가 제대로하고있는 것 같지 않지만 무슨 생각을 모르겠다.
지연을 사용하여 드로잉 속도를 제한하고 있습니다. 'timer_progress()'는'start'와'draw()'가 그 값을 사용하고 나서 경과 된 시간을 반환합니다. – martinkunev