2017-10-19 7 views
3

私はC#を学ぶ初心者のプログラマーで、コンソールウィンドウでテキストベースのスネークゲームを作りたかったのです。さて、このゲームはかなりうまく動作しますが、Thread.Sleep()メソッドを使用して特定の時間(ミリ秒)のコードを一時停止する問題が発生しました。C# - コンソールアプリケーションでThread.Sleepを正確に使用する

問題は、特定の時間、ゲームを一時停止しようとすると、数ミリ秒間、一時停止するように見えるということです。それはスネークゲームなので、それはかなり大きな問題です。

while (true) 
      { 
       double startingTime = DateTime.Now.TimeOfDay.Milliseconds; 
       //code 
       double lag = DateTime.Now.TimeOfDay.Milliseconds - startingTime; 
       Thread.Sleep((int)Math.Round(25 - lag)); 
       double finalTime = DateTime.Now.TimeOfDay.Milliseconds - startingTime; 
       Console.Title = string.Format("Time: {0}", finalTime); 
      } 

は、私がコードを実行するのに約6ミリ秒を要しているという事実のために知っているので、私はそれをmesure、それはすべての間で待機することになった時間からそれを引くことを試みた:私はやってみました何

動く時には正常に動作しますが、より頻繁にはコンソールのタイトルには31ミリ秒かかったと言われています...

私は本当にどんな提案もありがとうと思います。 、助けた皆に感謝し、私はタミールが推奨のように、ストップウォッチを使用して終了:D

+0

Thread.Sleepの代わりにSystem.Threading.Timerを使用してみてください。これはオーバーヘッドが原因で違いが出る可能性があります。詳細はこちら - https://stackoverflow.com/questions/391621/compare-using-thread-sleep-and-timer-for-delayed-execution –

+3

@StepanNovikovタイマーでさえ、数ミリ秒以内に正確になるわけではありません特にそのような短期間で。 – Servy

+5

ゲーム開発をしたい場合は、適切なゲーム開発フレームワーク/エンジンを使用することをお勧めします。あなたがしなければ、あなたはとにかく(ゲームループなどの)その基本的なフレームワークを自分自身で構築するように強制されます。 – Servy

答えて

4

まあ、非常に正確なタイミングのために、あなたが使用する必要がある時、私は:)

が解決を知って喜んでいますよmultimediaタイマー。 次の最良の選択肢はStopwatchです

+0

ありがとうございます、私はそれを確認してください –

関連する問題