GetAsyncKeyState() 非常重 CPU ?我是否正确使用它

GetAsyncKeyState() very CPU heavy? Am I using it correctly?

本文关键字:是否 非常重 CPU GetAsyncKeyState      更新时间:2023-10-16

我在我的一个简单的乒乓球游戏中使用GetAsyncKeyState((来检查用户是否按下了箭头键。我在网上读到你需要以某种方式使用这个功能,但我发现它非常重 CPU(使用我的 50% 的 CPU!这相当令人不安,但是,经过一番尝试,我发现如果我添加一个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);
}

这并不是说GetAsyncKeyState占用大量 CPU;而是您一直在尽可能快地调用它。这相当于说i++在无限循环中运行时会占用大量 CPU。

您应该使用 GetMessage 等到您实际有输入,或者如果这还不够好(因为您可能还想在不等待消息的情况下更新一些动画(,那么您应该选择一些轮询间隔并使用类似 MsgWaitForMultipleObjects 的东西(或使用 SetTimer 创建频繁重复的计时器消息(。

默认情况下,程序在没有某种消息机制、用户输入或阻止程序执行的内容的情况下无限重复的任何内容都会导致程序耗尽所有可用的 CPU 资源。

您最初实现的键盘输入处理效率极低。通过用Sleep阻止执行流,您已经设法克服了这个问题,但代价是准确性 - 如果用户设法在不到 1 毫秒的时间内按下一个键,您的程序将简单地忽略它。

您可以使用SetWindowsHookEx来设置键盘挂钩并直接拦截和处理击键,而不是使用GetAsyncKeyState不断检查按键。这些应该会有所帮助。

其他选项包括使用 DirectInput、外部输入处理库或包装器。