Как часто оконные приложения OpenGL проверяют наличие обновлений событий?

Я хотел бы понять, как работают функции обратного вызова в оконном приложении (например, FreeGLUT, GLFW).

Сколько раз они проверяют события клавиатуры/мыши/изменения размера в секунду?

Зависит ли это от частоты кадров, является ли она постоянной или зависит от операционной системы?


person plasmacel    schedule 28.08.2013    source источник
comment
Обычно это не операция опроса, а обычно событие изменения. Операционная система специфична почти для всех событий. Он создан, чтобы абстрагироваться от вас, но каждая ОС делает это немного по-своему. Обычно вы можете настроить обновление так, чтобы оно соответствовало обновлению монитора (vsync), или вы можете вручную контролировать время обновления.   -  person Justin Meiners    schedule 28.08.2013


Ответы (1)


Вообще говоря, не вдаваясь в особенности реализации Unix или Windows, обратные вызовы вызываются из основного цикла событий, который выглядит примерно так:

Loop forever {
   Get a message from the event queue.
   Process the message
}

Этап «Получить сообщение» будет иметь очень маленький сон, если он ожидает появления сообщения в очереди, вероятно, менее миллисекунды. Очередь событий будет содержать все сообщения, относящиеся к приложению, включая такие вещи, как нажатия кнопок мыши, события движения мыши, события клавиатуры и события окна, такие как изменение размера и экспонирование.

Шаг «Обработать сообщение» возьмет событие и отправит его тому, что имеет отношение к событию. Так, например, щелчок мышью может привести к обратному вызову виджета Button. Или, если в вашей области рисования OpenGL настроен обратный вызов обработчика ввода, щелчок мыши приведет к вызову этой функции.

Вот несколько ресурсов, чтобы узнать больше об этом процессе:

Для Windows: http://en.wikipedia.org/wiki/Message_loop_in_Microsoft_Windows

Для X/Motif: http://www.unix.com/man-page/all/3x/XtAppMainLoop/

Если вы хотите увидеть конкретные шаги на этом пути (их много), вы можете попробовать установить точку останова в интересующей вас функции, например, в вашей основной процедуре отрисовки OpenGL или в функции обратного вызова ввода. Затем стек вызовов покажет вам, как вы туда попали.

person MorbidFuzzball    schedule 28.08.2013
comment
Таким образом, они отправляются независимо от моего обратного вызова отрисовки FPS. - person plasmacel; 28.08.2013
comment
Это зависит от того, как вы настроили этот обратный вызов. Если он настроен как обратный вызов таймера, который вызывается, например, каждые 30 мс, событие с истекшим временем таймера будет помещено в очередь сообщений о событиях по истечении 30 мс. Когда это событие будет обработано основным циклом событий, будет вызвана ваша функция обратного вызова отрисовки. - person MorbidFuzzball; 28.08.2013