Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ xcb鼠标移动导致输入延迟_C++_C_Xlib_Glx_Xcb - Fatal编程技术网

C++ xcb鼠标移动导致输入延迟

C++ xcb鼠标移动导致输入延迟,c++,c,xlib,glx,xcb,C++,C,Xlib,Glx,Xcb,我编写了一些基本的OpenGL应用程序,使用XCB作为后端(当然是xlib for GLX),在我编写的每个测试中,当我将鼠标移到窗口上时,它会使所有输入都得到某种程度的“缓冲”,并且只在一段时间后响应事件(取决于输入的数量) 我调用xcb_poll_events并以这种方式获取事件信息,然后将其加载到自定义事件类中,但在我的旧xlib实现中,这从来都不会慢下来 是什么导致了这种滞后 事件轮询: Event_c system_class::poll_for_event(){ Event_

我编写了一些基本的OpenGL应用程序,使用XCB作为后端(当然是xlib for 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;
}

无法找出它导致延迟的原因,所以我调用了我的事件轮询函数,并在一个单独的线程中更新了用户输入(谢谢xcb),并在主线程中完成了所有渲染。现在它运行平稳,没有输入滞后。我希望我能弄清楚为什么它在单线程设计中落后://p>从您的示例来看,如果周围没有那么多事件(poll_for_事件将不断返回null),那么应用程序将在一个非常紧密的循环中运行,做了大量不必要的工作,并可能使整个系统变得迟钝

您是否检查过CPU利用率等?
可以安全地假设,在新设计中,您切换到了xcb_wait_for_事件吗?

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


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

整个系统都很好,应用程序运行得非常顺利,输入是唯一滞后的东西:/Yeah,这是一个安全的赌注;)循环运行太多次没有意义。唯一可能影响xcb_poll_for_事件行为的其他因素是队列互斥和recv()系统调用。其中一个,当访问太频繁时,会导致您的问题(如这里所证明的:)。谢谢,是的,我现在意识到这一点,但这个问题似乎过时了,我不知道是否要更新它:L