GetAsyncKeyState() 非常重 CPU ?我是否正确使用它
GetAsyncKeyState() very CPU heavy? Am I using it correctly?
我在我的一个简单的乒乓球游戏中使用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、外部输入处理库或包装器。
相关文章:
- 移动后是否需要重置标准::列表?
- 如何检测文件夹是否太重,如果是,请删除其中的一部分
- 是否可以将子进程的 stdout 重定向到父进程中的另一个文件?
- 如果输入类型与目标类型不同,"cin"变量是否重置为某个默认值?
- 由于 C++17 支持数组shared_ptr,这是否意味着在 ctor 和重置中不再需要 T[] 的显式删除器?
- 是否可以使用类的析构函数内部函数来重置值?
- 是否可以重置C 中的另一个值
- 是否有 GCC 标志来发出有关作用域内相同变量重定义的警告?
- 取消引用地址时是否可以重定向到其他地址?
- 是否有记录在案的方法可以在现有 std::exponential_distribution 对象上重置 lambda 参
- 是否可以知道树中的项目何时被重命名
- 如何查找函数是否可重入
- QPixmap是否可重入
- 是否必须重置 std::数组元素
- GetAsyncKeyState() 非常重 CPU ?我是否正确使用它
- 是否可以重命名已在使用的xls文件
- 如何在c++中检查std::cout是否被重定向到文件
- 是否可以重命名进程类窗口名
- 检查程序是否被重定向到标准输出
- 是否有重定向(cin)输入从文本文件在控制台两次,为c++