gpt4 book ai didi

c# - 在 .NET/GDI+ 中制作流畅的动画

转载 作者:行者123 更新时间:2023-11-30 17:57:59 25 4
gpt4 key购买 nike

我在 GDI+ 中制作流畅的动画时遇到问题。我从谷歌搜索中了解到的问题是,多核处理器上的 .NET 中的时钟滴答存在某种错误。这是我正在做的事情的简化版本:

class Animation
{
System.Diagnostics.Stopwatch sw = new Stopwatch();
float AnimationTime = 1000; //time it takes the animation to complete

public bool IsComplete
{ get { return sw.ElapsedMilliseconds > AnimationTime; } }

public void StartAnimation()
{
sw.Reset();
sw.Start();
}

public void DoFrame()
{
float PercentComplete = (float)sw.ElapsedMilliseconds / AnimationTime;
//draw the animation based on PercentComplete
}
}

DoFrame() 是这样调用的:

Animation.Start();
do
{
Animation.DoFrame();
Application.DoEvents();
} while (!Animation.IsComplete);

问题是动画在大约 15 帧时非常流畅,然后突然跳动,实际上是倒退(sw.ElapsedMilliseconds 给出的值小于之前的查询)。这非常烦人,它破坏了我原本流畅的动画,即使在 Core 2 Duo 上看起来也很棒(尽管 Microsoft 说这是一个多核错误)。我有一个 i7,动画很流畅,除了每秒 2-3 帧看起来“不稳定”。

我知道这是一个已知问题,Microsoft 将其归咎于处理器,所以我的问题是,有人知道解决方案吗?我尝试使用卡尔曼滤波器,它有点管用。我希望也许有一个既定的“正确”解决方案?

哦,顺便说一句。我尝试使用 DateTime 而不是 Stopwatch 并得到了相同的结果。

我也试过:

double PercentComplete = (double)sw.ElapsedTicks / (double)Stopwatch.Frequency * 1000 / AnimationTime

它给了我相同的结果。

最佳答案

这可能与您调用 DoFrame() 的方式有关。使用以下基于 Windows 窗体/GDI+ 的算法,您应该总能获得非常流畅的动画:

const double desiredFps = 500.0;
long ticks1 = 0;
var interval = Stopwatch.Frequency / desiredFps;
while (true)
{
Application.DoEvents();
var ticks2 = Stopwatch.GetTimestamp();
if (ticks2 >= ticks1 + interval)
{
ticks1 = Stopwatch.GetTimestamp();

// do the drawing here
}
}

关于c# - 在 .NET/GDI+ 中制作流畅的动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12815701/

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