1

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

我将用户控件的样式设置为:

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

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

因此,我似乎按照书本做了所有事情,以进行超流畅的无闪烁绘图,但我仍然可以看到对象有点口吃。

所以基本上剩下两种可能性:正在调用的 Timer.Invalidate(DirtyRect)没有以恒定的时间间隔精确触发,导致对象出现断断续续的现象,或者 BitBlt 没有按预期工作。

有谁知道可能是什么问题?

更新:再想一想,它看起来更像是撕裂,而不是口吃或闪烁。因为有时对象似乎错过了最后几个像素。我将研究利用 VSYNC 的可能性。

4

1 回答 1

1

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

长话短说,在升级计算机之前,我必须在单核上运行主要的 OpenGL 循环。如果在屏幕上移动字形之前运行以下代码(或类似代码)有帮助,那么您将遇到同样的问题。这是 C# 版本。

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

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

于 2014-02-07T20:21:16.237 回答