gpt4 book ai didi

c# - 如何消除 WinForms 滚动动画中的抖动?

转载 作者:太空狗 更新时间:2023-10-30 00:04:17 27 4
gpt4 key购买 nike

我正在用 C# 编写一个像图片框一样工作的简单控件,只是图像不断向上滚动(并从底部重新出现)。动画效果由计时器 (System.Threading.Timer) 驱动,该计时器从缓存图像(分为两部分)复制到隐藏缓冲区,然后在其 Paint 事件中绘制到控件的表面。

问题在于,当以每秒 20+ 帧的高帧率运行时,此滚动动画效果会略微不稳定(在较低的帧率下,效果太小而无法察觉)。我怀疑这种抖动是因为动画与我的显示器的刷新率没有任何同步,这意味着每个帧在屏幕上停留的时间长度可变,而不是正好 25 毫秒。

有什么方法可以让这个动画流畅地滚动吗?

您可以下载示例应用程序 here (运行它并点击“开始”),源代码为here .它看起来并不可怕,但如果你仔细观察它,你会看到打嗝。

警告:此动画会产生非常奇怪的视错觉效果,可能会让您感到有点恶心。如果您观看它一会儿然后将其关闭,它看起来就像您的屏幕在垂直拉伸(stretch)一样。

更新:作为实验,我尝试用我的滚动位图创建一个 AVI 文件。结果不像我的 WinForms 动画那么生涩,但仍然不能接受(而且它仍然让我看得太久感到恶心)。我认为我遇到了与刷新率不同步的根本问题,所以我可能不得不坚持让人们对我的外表和个性感到厌恶。

最佳答案

您需要等待 VSYNC在绘制缓冲图像之前。

有一个CodeProject article建议使用多媒体计时器和 DirectX 的方法 IDirectDraw::GetScanLine() .

我很确定您可以通过 Managed DirectX 使用该方法来自 C#。

编辑:

经过更多研究和谷歌搜索后,我得出结论,通过 GDI 绘图不会实时发生,即使您在正确的时刻绘图,它实际上也可能发生得太晚并且您会撕裂。

因此,对于 GDI,这似乎是不可能的。

关于c# - 如何消除 WinForms 滚动动画中的抖动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/950294/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com