我已经编写了一些基本的OpenGL应用程序,其中XCB作为后端(当然是GLX的xlib),并且在我将鼠标移到窗口上时所写的每个测试中都会导致所有输入变为“缓冲”和仅在一段时间后响应事件(根据输入的数量而变化)。
我正在调用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 :(得分:1)
您的问题是,您在两次调用xcb_poll_for_event之间调用glXSwapBuffers。因此,每个屏幕刷新只能处理一条消息。
除了您的多线程解决方案,您可以简单地处理事件,直到xcb_poll_for_event返回零。处理完所有待处理事件后,您可以返回渲染。
答案 1 :(得分:0)
无法弄清楚它导致滞后的原因,所以我调用了我的事件轮询功能并在一个单独的线程中更新了用户输入(谢谢xcb)并在主线程中完成了所有渲染。现在它运行平稳,没有输入延迟。我希望我能弄清楚为什么它在单线程设计中滞后:/
答案 2 :(得分:0)
从你的例子来看,如果周围没有那么多事件(poll_for_events将继续返回NULL),应用程序将在一个非常紧密的循环中运行,从而做了大量不必要的工作,并可能使整个系统变得迟缓
您是否检查了CPU利用率等? 假设在您的新设计中切换到xcb_wait_for_event?
是否安全?