您可以在这里做几件事。第一种是使用计时器以标准速率进行更新。如果您使用的是 Windows 窗体,则可以在窗体上放置一个计时器组件并将周期设置为 15 毫秒。这将给你(大约)每秒 66 帧更新。
请注意,.NET 计时器最多可为您提供大约 15 毫秒的分辨率。您可以滚动您自己的 Windows 计时器之一的实现,以提供 1 毫秒的分辨率,但这样做会使您的代码变得非常复杂。
您可以做的另一件事是让更新CurrentFrame
图像的代码调用更新方法,并让更新方法的更新频率不超过某个设定的速率。您可以通过Stopwatch
在程序开头启动 a 并检查自上次更新以来经过的时间来执行此操作。就像是:
private Stopwatch FrameTimer = Stopwatch.StartNew();
private long LastUpdateTime = 0;
private const long MinUpdateMs = 10; // minimum time between updates
void DoUpdate()
{
long currentTime = FrameTimer.ElapsedMilliseconds;
if ((currentTime - LastUpdateTime) < MinUpdateMs)
{
// updated within the last 10 ms
return;
}
LastUpdateTime = currentTime;
if (CurrentFrame != null)
{
g.DrawImageUnscaled(CurrentFrame, 0,0);
}
}
第二个选项非常有效,尽管如果没有持续更改,您将面临无法获得最新更新的风险。如果您CurrentFrame
的 . 如果你这样做,你想在DoUpdate
方法中添加一些同步来防止并发更新。我会建议:
private object UpdateLock = new object();
void DoUpdate()
{
if (!Monitor.TryEnter(UpdateLock))
{
// update already in progress
return;
}
try
{
long currentTime = FrameTimer.ElapsedMilliseconds;
if ((currentTime - LastUpdateTime) < MinUpdateMs)
{
// updated within the last 10 ms
return;
}
LastUpdateTime = currentTime;
if (CurrentFrame != null)
{
g.DrawImageUnscaled(CurrentFrame, 0,0);
}
}
finally
{
Monitor.Exit(UpdateLock);
}
}