1

ユーザーが矢印キーを押したかどうかを確認するために、私の単純なピンポン ゲームで GetAsyncKeyState() を使用しています。この関数を特定の方法で使用する必要があることをオンラインで読みましたが、CPU が非常に重いことがわかりました (CPU の 50% を使用しています!)。これはかなり戸惑いましたが、いくつか遊んだ後、a を追加するsleep(1);と CPU 使用率が 0% になり、すべてが正常に機能することがわかりました。この関数を使用するより良い方法、または少なくとも CPU 使用率を下げるより良い方法があるはずです。

ここで何か助けていただければ幸いです!

私のコード:

while(true)
{
    for(i = 8; i < 191; ++i)
    {
        if(GetAsyncKeyState(i) == -32767)
        {
            if(i == VK_LEFT)
                 // do stuff
            else if(i == VK_RIGHT)
                 // do stuff
            else if(i == VK_UP)
                 // do stuff
            else if(i == VK_DOWN)
                 // do stuff
        }
    }
    Sleep(1);
}
4

2 に答える 2

2

GetAsyncKeyStateCPU が重いというわけではありません。できるだけ早くそれを常に呼び出しているということです。i++無限ループで実行すると、CPU が重いと言うのと同じです。

実際に入力があるまで待機するために使用するかGetMessage、それでは不十分な場合 (メッセージを待たずにアニメーションを更新したい場合もあるため)、ポーリング間隔を選択して次のようなものを使用する必要がありますMsgWaitForMultipleObjects(または頻繁に作成する)の繰り返しタイマーメッセージSetTimer)。

于 2012-05-21T02:39:45.427 に答える
1

なんらかのメッセージメカニズム、ユーザー入力、またはプログラムの実行をブロックするものがなくても、プログラムが無限に繰り返されると、デフォルトでは、プログラムは使用可能なすべてのCPUリソースを使い果たします。

キーボード入力処理の元の実装は、非常に非効率的でした。実行フローをブロックするSleepことで、その問題を克服できましたが、精度が犠牲になります。ユーザーが1ミリ秒未満でキーを押すことができた場合、プログラムはそれを単に無視します。

GetAsyncKeyStateキーが押されているかどうかを常にチェックするために使用する代わりにSetWindowsHookEx、キーボードフックを設定し、キーストロークを直接インターセプトして処理するために使用できます。これらは役立つ はずです。

他のオプションは、DirectInput、外部入力処理ライブラリまたはラッパーを使用することです。

于 2012-05-21T03:05:24.987 に答える