ここでできることがいくつかあります。1 つ目は、タイマーを使用して標準レートで更新を行うことです。Windows フォームを使用している場合は、Timer コンポーネントをフォームにドロップして、期間を 15 ミリ秒に設定できます。これにより、1 秒あたり (約) 66 フレームの更新が行われます。
.NET タイマーでは、せいぜい約 15 ミリ秒の分解能しか得られないことに注意してください。Windows タイマーのいずれかを独自に実装して 1 ミリ秒の精度を実現できますが、そうするとコードが非常に複雑になります。
他にできることは、CurrentFrame
画像を更新するコードに update メソッドを呼び出してもらい、その update メソッドを一定の設定レートよりも頻繁に更新しないようにすることです。これを行うには、プログラムの先頭で aStopwatch
を開始し、最後の更新からの経過時間を確認します。何かのようなもの:
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);
}
}
2 番目のオプションは非常に効果的ですが、継続的な変更がない場合、最後の更新を取得できないリスクがあります。の更新間隔が長くなる可能性がある場合CurrentFrame
は、約 1 秒ごとに更新を強制するタイマーを設定できます。その場合は、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);
}
}