私はC#で一種のゲームをプログラミングしていますが、メモリ使用量のより良いアプローチは何か知りたいです。今私はそれを持っているので、それはwhileループを通過し、ゲームの実行中に特定の事柄(この人が死んでいるかなど)をチェックし、1秒間スリープしてから、再試行します。ゲームが終了すると、whileはfalseに設定され、メソッドを終了します。タイマーはこれを行うためのより良い方法でしょうか?このゲームを実行すると、メモリの問題に気付くことがあります。
6 に答える
while
ループ アプローチはおそらく問題ではありません 。Timer
実際には、このアプローチよりも少し重く、より多くのシステム リソースを消費しますが、これは 1 回限りの割り当てになります。つまり、メイン ループ コードをある構造から別の構造に変更しても、アプリケーションのメモリ プロファイルが大幅に変わる可能性はほとんどありません。
アプリケーションのメモリ使用量をプロファイリングしてみましたか? 不要になったオブジェクトを保持している可能性があります。プロファイラーは、場所を特定するのに役立つ場合があります。
(興味がある方のために説明すると、a を使用するTimer
と、パフォーマンスへの影響が非常に小さい可能性があります。これは、反復ごとに関数ポインター呼び出しが発生し、CPU と JIT コンパイラーがうまく最適化できないためです。while
ループを使用すると、コードが常に実行されていることを意味します。 ;Thread.Sleep()
関数ポインタを介していないため、呼び出しはかなり適切に最適化できます. このTimer
方法ではコードが読みにくくなる可能性があることも考慮して、while
ループを引き続き使用することを強くお勧めします.)
はい、メインのゲーム ループには while ループを使用する必要がありますが、Sleep は使用しないでください。代わりに、最後にフレームを描画したときにタイムスタンプを付け、ループを通過するたびに、1/30 秒または何かが経過したかどうかを確認する必要があります。そうでない場合は、通過するまでビジー ループを繰り返します。
毎秒の「死んだ人」のようなこと (IMO の悪い例ですが) は、「人が死んだ」コードが最後になってから 1 秒経過しているかどうかを確認するチェックによって保護された別のタイムスタンプで簡単に実行できます。走る。タイマー スレッドでその処理を実行する非常に説得力のある理由がない限り、同期的に実行することをお勧めします。
メモリの問題は、while ループの使用とはほとんど関係ありません。リストなどにアイテムを繰り返し追加していないことを確認し、using
コンストラクトを使用してリソースの初期化が行われていることを確認してください。
using (StreamReader sr = File.OpenText(path))
{
// blah blah using sr
}
// The streamreader has been automatically disposed by this point.
これをタイマーとスリープに変更しても、(事実上) メモリ使用量に影響はありません。主な違いは、アプリケーションの実行方法のロジックにあります。タイマーを使用すると、while ループで順次処理が行われるのではなく、定期的に発生する一連の「イベント」が発生します。
このようなタスクには while ループが最適な方法だと思います (おそらくスレッドと組み合わせて)。タイマーは主に、より長く正確な期間用です。
正確な答えではありませんが、代替案です。イベント駆動型のアプローチは、どの繰り返しチェックよりも優れていると思います (繰り返しチェックをどのように実装するかに関係なく)。コードの一部がプレーヤーを殺す場合、他のコードがフックできるイベントも呼び出す必要があります。
メモリの問題に関しては、ソースがなければ、コードをプロファイリングして、そのすべてのメモリが何であるかを確認することをお勧めします。