Я написал несколько базовых приложений OpenGL с XCB в качестве бэкэнда (xlib для GLX, конечно), и в каждом написанном мною тесте, когда я наводю указатель мыши на окно, все входные данные становятся «буферизованными» и реагируют только на события после определенного периода времени (варьируется в зависимости от того, сколько входов).
Я вызываю xcb_poll_events и получаю информацию о событии таким образом, затем загружаю ее в пользовательский класс событий, но это никогда не было медленным в моей старой реализации xlib.
Что может быть причиной этого отставания?
Опрос мероприятия:
Event_c system_class::poll_for_event(){
Event_c temp;
xcb_generic_event_t *event;
event = xcb_poll_for_event(this->connection_xcb);
if(!event)
return temp;
switch(event->response_type){
handle events...
}
free(event);
return temp;
}
и цикл событий в тестовом приложении:
int main(int argc, char *argv[]){
init stuff...
system_class app;
window_class window;
Event_c event;
while(running){
event = app.poll_for_event();
if(event.detail){
handle user input...
}
window.swap_buffers(); // just calls glXSwapBuffers
}
return 0;
}
Ваша проблема в том, что вы вызываете glXSwapBuffers между двумя вызовами xcb_poll_for_event. Поэтому вы можете обрабатывать только одно сообщение за обновление экрана.
Помимо вашего многопоточного решения вы можете просто обрабатывать события, пока xcb_poll_for_event не вернет ноль. Когда вы закончите обработку всех ожидающих событий, вы можете вернуться к визуализации.
Не мог понять, почему это вызывает задержку, поэтому я вызвал мою функцию опроса событий и обновил пользовательский ввод в отдельном потоке (спасибо xcb) и сделал весь мой рендеринг в основном потоке. Теперь он работает плавно и не имеет входной задержки. Хотелось бы мне понять, почему в однопоточной конструкции он отстает: /
Судя по вашему примеру, приложение будет работать в очень узком цикле, если не будет большого количества событий (poll_for_events будет продолжать возвращать NULL), выполняющих много ненужной работы и, возможно, замедляющих работу всей системы.
Вы проверяли загрузку процессора и тому подобное?
Можно ли предположить, что в своем новом дизайне вы переключились на xcb_wait_for_event?