シンプルな2Dゲームを作りたい。スレッドを使用したくありません。プログラミング言語はJavaになります(ただし、どの言語でもかまいませんが、実際には問題ではありません...)。
while(true)...
(無限ループ)のようなメイン ループを使用すると、CPU 使用率が高くなることを回避できますか?
シンプルな2Dゲームを作りたい。スレッドを使用したくありません。プログラミング言語はJavaになります(ただし、どの言語でもかまいませんが、実際には問題ではありません...)。
while(true)...
(無限ループ)のようなメイン ループを使用すると、CPU 使用率が高くなることを回避できますか?
ゲームでは通常、すべてを実行するメイン ループがあります。ただし、不必要なことを避けるために、特定のフレームレート (毎秒 60 フレーム (FPS) など) でのみゲームを更新するのが一般的です。
ほとんどのゲームは、新しいフレームの計算/描画が必要になるまで CPU をスリープ状態にすることでこれを実現します。Python ゲーム ライブラリ pygame では、これはpygame.time.waitを使用して行われます。
指定されたミリ秒数だけ一時停止します。この関数は、プロセスをスリープさせて、プロセッサを他のプログラムと共有します。数ミリ秒でも待機するプログラムは、プロセッサ時間をほとんど消費しません。
ダースフェットの答えを説明するために、コンソールゲームのメインループは通常次のようになります。
#define FRAMELENGTH (1.0 / 60.0) // 60hz = 16.6ms per NTSC frame. Different for PAL.
while ( !QuitSignalled() )
{
double frameStartTime = GetTime(); // imagine microsecond precision
HandleUserInput( PollController() );
SimulateEntities();
Physics();
Render();
Sound();
etc();
double timeUntilNextFrameShouldStart = GetTime() - frameStartTime + FRAMELENGTH;
sleep( timeUntilNextFrameShouldStart );
}
// if down here, we got the 'quit' signal
ExitToDesktop();
もちろん、フレームの実行に16.6ミリ秒以上かかると、上記のループが壊れます。そのため、それを検出してフレームをキャッチアップまたはドロップするための特別なコードがありますが、これが基本的な考え方です。また、最近まで、実際には時間に浮動小数点数を使用していませんでしたが、固定小数点マイクロ秒カウンターを使用していました。
あなたがしなければならないのは、「入力をブロックする」ことだけです...そして、CPU使用率はゼロになります。とにかく、何かが起こるまで。
ほとんどのソケットプログラムには、次のようなループがあります。
while (true) {
select ()
...
getchar()
" "、または " "WaitOnSingleEvent()
を簡単に待つことができます。
「I/O のブロック」は実際には最適な設計戦略であると主張する人もいるかもしれません。それは、「ポーリング」(ポーリングは悪)という代替手段を打ち負かします。
私見では..