我需要绘制一条随光标移动的线,但我想避免每隔100ms重绘整个窗口

时间:2011-12-20 08:53:31

标签: graphics gtk flicker cairo xlib

我有一个程序在屏幕上显示一个标尺,并且使用Xlib每隔100ms轮询一次光标位置并更新显示。显示器由数字/线等组成,特别是一条指示光标位置的线(这就是它更新的原因)。

问题是需要删除旧行并恢复下面的内容,因此我必须重绘整个窗口以反映位置的变化。每秒这样做10次会产生一个非常闪烁的程序。

只能重新绘制标尺后我确认光标处于更改指示线的位置(即在标尺的范围内),但是当它确实仍然闪烁相当糟糕时正在更新。

将菜鸟排序为GTK和Xlib以及所有建议,我们将不胜感激。

代码位于https://github.com/zjmichen/zRuler

1 个答案:

答案 0 :(得分:2)

嗯,你已经达到了游标实施时面临的最早问题之一!光标变化非常频繁,每次重绘整个窗口都没有任何意义!来你的问题,看看需要什么&你在做什么光标移动时是否需要更新完整窗口?不需要。您只需更新窗口的一部分,因此不要更新整个窗口。在顶部,我可以想到两种减少闪烁的方法:
1.简单的方法是使用GdkCursor。从像素图(开发者页面上提供的示例)创建一个新光标,其中包含您需要的形状,在您的案例中为一行。 Associate光标位于应用程序主窗口的GdkWindow。这样您就不必跟踪光标和放大器。划清界线。光标本身将显示为行(因此您不必担心清除和重绘它)。现在,在重绘整个窗口的计时器回调中,仅重绘在光标位置更改时必须更新的组件。这应该有希望减少闪烁,因为你没有绘制所有组件 2.如果您不想使用GdkCursor,可以在专用于光标的应用程序窗口顶部创建一个单独的透明窗口。在这种方法中,您只能更新光标窗口&应用程序窗口中的组件,用于更改光标位置的更新。这样,每次都不会重新绘制应用程序窗口中的其他组件。希望这也应该能够减少闪烁 希望这有帮助!