我在 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 上看起来也很棒(尽管微软说这是一个多核错误)。我有一个 i7,动画很流畅,除了每秒 2-3 帧看起来“生涩”。
我知道这是一个已知问题,微软将其归咎于处理器,所以我的问题是,有没有人知道任何解决方案?我尝试使用卡尔曼滤波器,它有点工作。我希望也许有一个既定的“正确”解决方案?
哦,顺便说一句,我尝试使用 DateTime 而不是 Stopwatch 并得到了相同的结果。
我也试过:
double PercentComplete = (double)sw.ElapsedTicks / (double)Stopwatch.Frequency * 1000 / AnimationTime
它给了我同样的结果。