从 X11 队列中删除额外的公开消息

Remove Extra Expose Messages From X11 Queue

本文关键字:消息 X11 队列 删除      更新时间:2023-10-16

我有一个程序,它有一个线程,可以使用XSendEvent生成Expose消息。 第二个线程接收Expose消息以及其他消息(主要是输入处理)。 问题是发送线程以恒定速率(~60Hz)发送Expose消息,但接收线程的渲染速度可能比这慢。 X11 队列将陷入额外的Expose消息的泥潭,任何输入处理消息都将开始远远落后于所有这些额外的Expose消息。

在Windows中,这不是问题,因为Windows会自动将所有WM_PAINT消息合并为一条消息。 在 X11 中有什么方法可以做到这一点,或者其他方法可以解决这个问题吗?

您可以轻松地自己与XCheckTypedEvent()和朋友合并任何类型的活动。

我能够通过以下方式解决此问题:

使用 XPeekEvent 阻止呈现线程。

当事件进入时,使用 XPendingXNextEvent 的组合将所有事件读入新的队列数据结构中,但只复制第一个公开消息。

然后对新的队列数据结构运行事件处理循环。

这为我解决了问题,但我认为使用XCheckTypedEvent的解决方案(根据 n.m. 的答案在这里)可能更优雅。

你可以

做一些事情:

  • 如果要对每个事件进行完全重绘,则只有计数为 0、计数> 1 的操作事件才是特定矩形的重绘
  • 如果为窗口的一部分生成公开事件,这将减少每个公开事件所做的工作量
  • 恒定速率意味着您可以只处理每 n 个事件或保留自上一个事件以来的时间,并忽略给定时间内收到的事件