从 X11 队列中删除额外的公开消息
Remove Extra Expose Messages From X11 Queue
我有一个程序,它有一个线程,可以使用XSendEvent
生成Expose
消息。 第二个线程接收Expose
消息以及其他消息(主要是输入处理)。 问题是发送线程以恒定速率(~60Hz)发送Expose
消息,但接收线程的渲染速度可能比这慢。 X11 队列将陷入额外的Expose
消息的泥潭,任何输入处理消息都将开始远远落后于所有这些额外的Expose
消息。
在Windows中,这不是问题,因为Windows会自动将所有WM_PAINT消息合并为一条消息。 在 X11 中有什么方法可以做到这一点,或者其他方法可以解决这个问题吗?
您可以轻松地自己与XCheckTypedEvent()
和朋友合并任何类型的活动。
我能够通过以下方式解决此问题:
使用 XPeekEvent
阻止呈现线程。
当事件进入时,使用 XPending
和 XNextEvent
的组合将所有事件读入新的队列数据结构中,但只复制第一个公开消息。
然后对新的队列数据结构运行事件处理循环。
这为我解决了问题,但我认为使用XCheckTypedEvent
的解决方案(根据 n.m. 的答案在这里)可能更优雅。
你可以
做一些事情:
- 如果要对每个事件进行完全重绘,则只有计数为 0、计数> 1 的操作事件才是特定矩形的重绘
- 如果为窗口的一部分生成公开事件,这将减少每个公开事件所做的工作量
- 恒定速率意味着您可以只处理每 n 个事件或保留自上一个事件以来的时间,并忽略给定时间内收到的事件
相关文章:
- boost::进程间消息队列引发错误
- 在线编译器中的分段C++没有打印消息
- C++错误消息*成员参考.**初学者*
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何通过参数抛出错误消息
- 从服务器传输到客户端的消息不会出现
- ROS2 动态消息模板
- C++秘密消息学校作业
- glad 导致 glfwSwapBuffers 返回错误消息
- C++入门 5 版:类消息和文件夹
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 如何接受 [ENTER] 键作为无效输入并发送错误消息
- 由于无效的 ValidateRgn() 子窗口不会收到WM_PAINT消息
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 为什么 KMS drmModeSetCrtc() 在 X11 会话中运行时会失败并被拒绝权限?
- 使用 c++/WinRT Direct3D UWP Game DR 模板 Direct X11 的错误消息
- WM_ACTIVATE和WM_SYSCOMMAND X11 的等效消息
- 从 X11 队列中删除额外的公开消息