2

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

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

4

3 回答 3

4

XCheckTypedEvent()您可以很容易地与自己和朋友合并任何类型的事件。

于 2013-09-07T22:03:33.400 回答
1

我能够解决这个问题如下:

使用 .阻塞渲染线程XPeekEvent

当一个事件进来时,使用XPending和的组合将所有事件读入一个新的队列数据结构XNextEvent,但只复制第一个暴露消息。

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

这解决了我的问题,但我认为使用XCheckTypedEvent(per nm's answer here)的解决方案可能更优雅。

于 2013-09-09T14:55:36.257 回答
0

你可以做的几件事:

  • 如果您对每个事件都进行完全重绘,则只有计数为 0 的动作事件,计数 > 1 是特定矩形的重绘
  • 如果您为部分窗口生成暴露事件,这将减少每个暴露事件所做的工作量
  • 恒定速率,意味着您可以只处理每第 n 个事件或自上一个事件以来保留一个时间并忽略在给定时间内收到的事件
于 2013-09-07T12:23:03.960 回答