движение мыши xcb вызывает задержку ввода

Я написал несколько базовых приложений 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;
}

0

Решение

Ваша проблема в том, что вы вызываете glXSwapBuffers между двумя вызовами xcb_poll_for_event. Поэтому вы можете обрабатывать только одно сообщение за обновление экрана.

Помимо вашего многопоточного решения вы можете просто обрабатывать события, пока xcb_poll_for_event не вернет ноль. Когда вы закончите обработку всех ожидающих событий, вы можете вернуться к визуализации.

1

Другие решения

Не мог понять, почему это вызывает задержку, поэтому я вызвал мою функцию опроса событий и обновил пользовательский ввод в отдельном потоке (спасибо xcb) и сделал весь мой рендеринг в основном потоке. Теперь он работает плавно и не имеет входной задержки. Хотелось бы мне понять, почему в однопоточной конструкции он отстает: /

0

Судя по вашему примеру, приложение будет работать в очень узком цикле, если не будет большого количества событий (poll_for_events будет продолжать возвращать NULL), выполняющих много ненужной работы и, возможно, замедляющих работу всей системы.

Вы проверяли загрузку процессора и тому подобное?
Можно ли предположить, что в своем новом дизайне вы переключились на xcb_wait_for_event?

0
По вопросам рекламы [email protected]