代码之家  ›  专栏  ›  技术社区  ›  default

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

  •  2
  • default  · 技术社区  · 11 年前

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

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

    3 回复  |  直到 11 年前
        1
  •  4
  •   n. m. could be an AI    11 年前

    你可以很容易地将自己与任何类型的事件结合起来 XCheckTypedEvent() 和朋友。

        2
  •  1
  •   Community CDub    8 年前

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

    使用阻止渲染线程 XPeekEvent .

    当事件进入时,使用以下组合将所有事件读取到新的队列数据结构中 XPending XNextEvent ,但仅复制第一条公开消息。

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

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

        3
  •  0
  •   parkydr    11 年前

    你可以做的几件事:

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