即使采用双缓冲,GDI +也会闪烁

时间:2013-01-28 17:51:12

标签: .net gdi+ gdi flicker double-buffering

我正试图将一个小图像从左侧移动到屏幕右侧。

我将usercontrol的样式设置为:

    this.SetStyle(ControlStyles.Opaque, true);
    this.SetStyle(ControlStyles.UserPaint, true);
    this.SetStyle(ControlStyles.ResizeRedraw, true);
    this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);

在我的OnPaint处理程序中,我将对象绘制到BufferedGraphics实例,这是我的屏幕外缓冲区,然后使用单个调用将结果BitBlt到e.Graphics引用。

所以看起来我按照这本书做了所有事情,拥有超顺畅的无闪烁绘图,而且我仍然可以看到物体有点卡顿。

因此,基本上还有两种可能性:调用.Invalidate(DirtyRect)的Timer不会以固定间隔精确触发,导致对象看起来断断续续,或者BitBlt无法按预期工作。

有没有人知道会出现什么问题?

更新:第二个想法,它看起来更像是撕裂,而不是口吃或闪烁。因为有时候对象似乎错过了最后几个像素。我将研究在VSYNC上绘制的可能性。

1 个答案:

答案 0 :(得分:1)

这可能完全没有用,但我遇到了类似的问题,我花了很长时间才弄清楚所以我会提到它。由于我的CPU在多个内核上管理性能计数器的方式,我遇到了一个特定于硬件的问题,这会影响定时器的准确性。

总而言之,我必须在一个核心上运行我的主要OpenGL循环,直到升级我的计算机。如果在将字形移动到屏幕上之前运行以下代码(或类似代码)有帮助,那么您遇到了同样的问题。这是c#版本。

Process.GetCurrentProcess().ProcessorAffinity = (IntPtr)1;

我希望这会有所帮助。但是,我也希望这不是你的问题。小心。