1

我在我的一个简单的乒乓球游戏中使用 GetAsyncKeyState() 来检查用户是否按下了箭头键。我在网上读到您需要以某种方式使用此功能,但我发现它非常占用 CPU(使用了我的 CPU 的 50%!)。这是相当令人不安的,然而,在玩了一些之后,我发现如果我添加了一个,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 回答