【.Net C#】Thread.Sleep と Task.Delay が遅い

ゲームを作るときに Unity を使ったりする場合は気にする必要がないのですが、そういったツールを使わない場合、FPS を固定させるために1フレーム未満で処理が完了したら残りの時間待つ…という処理が必要になります。

※本稿での FPS は、ファーストパーソンシューターの略ではなく、フレーム・パー・セカンド(毎秒のフレーム数)のことです。

そうしないと、フレームレートが一定にならないので FPS も一定になりません。
ゲームのスピードが毎フレームバラバラになり、カクカクした動きになります。

FPS 60 の場合、1フレームは 16.6666…ミリセカンド以内に処理する。
FPS 30 の場合、1フレームは 33.3333…ミリセカンド以内に処理する。

ゲームループ(float delta_time) {
 ゲームの色んな処理をする
 if (1フレーム未満で処理が終わってる) {
  余った時間待つ
 }
 次のフレームの処理へ
}

疑似コードで表現すると、上記のような処理になります。
本稿では、上記疑似コード中の「余った時間待つ」処理を .Net を使って実装する場合の注意点について説明します。

“【.Net C#】Thread.Sleep と Task.Delay が遅い” の続きを読む

【.Net C#】Enumerator の使い方

この記事では Microsoft .Net Framework の Enumerator および IEnumerable<T> の使い方について説明しています。

動作確認した環境
Microsoft Visual C# Compiler 3.5.0 beta4
.Net Framework 4.8.03752

2021/01/07
サンプルソースコード内 GetEnumerator() の戻り値の型を IEnumerable から IEnumerator に修正。
 
“【.Net C#】Enumerator の使い方” の続きを読む