0

我已经编写了一些基本的 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;
}
4

3 回答 3

2

您的问题是,您在两次调用 xcb_poll_for_event 之间调用 glXSwapBuffers。因此,每次屏幕刷新只能处理一条消息。

除了您的多线程解决方案之外,您还可以简单地处理事件,直到 xcb_poll_for_event 返回零。处理完所有未决事件后,您可以返回渲染。

于 2014-08-25T12:08:18.963 回答
0

无法弄清楚为什么会导致延迟,所以我调用了我的事件轮询函数并在一个单独的线程中更新了用户输入(谢谢 xcb),并在主线程中完成了我的所有渲染。现在它运行平稳并且没有输入延迟。我希望我能弄清楚为什么它在单线程设计中滞后:/

于 2013-10-28T05:05:54.383 回答
0

从您的示例来看,如果周围没有那么多事件(poll_for_events 将继续返回 NULL)做很多不必要的工作并可能使整个系统变得迟缓,应用程序将在一个非常紧密的循环中运行。

你检查过CPU利用率等吗?假设在您的新设计中切换到 xcb_wait_for_event 是否安全?

于 2013-10-28T06:15:07.017 回答