2013-10-27 3 views
0

Я написал несколько базовых приложений OpenGL с XCB в качестве бэкэнд (xlib для GLX, конечно), и в каждом тесте, который я написал, когда я двигаю мышью над окном, он вызывает все входные данные своего рода «буферизованный» и реагирует только на события через определенный промежуток времени (варьируется в зависимости от количества входов).xcb mouse motion вызывает входную задержку

Я вызываю 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; 
} 

ответ

1

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

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

+0

Спасибо, да, я понимаю это сейчас, но этот вопрос казался архаичным, и я не знал, обновлять его: L – CoffeeandCode

0

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

0

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

Вы проверили использование ЦП и т. Д.? Можно ли предположить, что в новом дизайне вы переключились на xcb_wait_for_event?

+0

Вся система была в порядке, и приложение работало ровно, как черт, вход был единственным, что отставало:/Да, это была бы безопасная ставка;) Не нужно слишком много запускать цикл. – CoffeeandCode

+0

Единственное, что может повлиять на поведение xcb_poll_for_event, - это системный вызов очереди mutex и recv(). Один из них, при слишком частом доступе, вызывает вашу проблему (как показано здесь: http://cgit.freedesktop.org/xcb/libxcb/tree/src/xcb_in.c). – oakad

Смежные вопросы