3

当我在 VS2012 中调试我的应用程序并且它崩溃时,输入(鼠标和键盘)开始极度滞后,fps 下降到大约 0.3 或更低,我什至不能在不等待 3 秒的情况下移动鼠标......唯一的解决方案是做 Shift-F5 将结束调试,然后一切都很好。

更有趣的是,唯一滞后的是输入,整个背景工作得非常好,文本插入符号以正常速率闪烁,当鼠标悬停在按钮上时,工具提示的动画效果很好。

我用allegro 4.2编译项目(我必须使用它,解释原因需要太长时间)。

我没有扩展,一个相当快的电脑应该能够处理调试......

我对任何解决方案感兴趣,它可能是肮脏/骇人听闻的......如果需要,我当然可以提供更多信息。

谢谢你的帮助。

编辑:通过论坛阅读,我发现了一些关于“自动”窗口或类似的信息(不记得确切,再也找不到了),它正在执行一些“后台任务”,这会导致滞后......做你认为在单独的核心上运行它会解决这个问题吗?

4

2 回答 2

9

遇到断点时的多秒停顿的故事,与原始输入 API 有关: http: //the-witness.net/news/2012/12/finding-and-fixing-a-five-second-stall/存档

自从我上次看到这种东西以来已经很长时间了,但我似乎记得我的罪魁祸首是 DirectInput。(考虑到上面的故事,这是有道理的,因为 DirectInput 长期以来一直是原始输入 API 的包装器。)我认为解决方案是使用模拟的键盘和鼠标设备而不是默认设备,您可以通过将模拟设备 GUID 之一传递给IDirectInput8_CreateDevice. 在这里简要讨论:http: //msdn.microsoft.com/en-us/library/windows/desktop/ee416845%28v=vs.85%29.aspx

(我不记得合作和排他性水平是否有所不同——也可能值得尝试改变这些。)

于 2013-08-02T22:24:02.987 回答
4

我最近在调试游戏时遇到了以下类似问题:

  • 命中断点,停止程序进行调试。
  • 现在按下任意键大约需要 1 秒来“处理”。它将被缓冲并一个接一个地缓慢发送到现在处于活动状态的任何窗口。

在我的例子中,应用程序安装了一个低级键盘钩子,带有SetWindowsHookEx(WH_KEYBOARD_LL, ...). 删除它后(对于 !NDEBUG 仅按您的意愿构建),输入滞后消失了。

我想当你的应用程序停止时,钩子根本无法响应,最终系统在超时后跳过它,这个长度可以按照这里HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout:DWORD提到的以毫秒为单位进行配置。事实上,接受的答案中的链接提到了这个问题,但我想我在这里解释了它的核心,也是因为链接在我修复它之前就死了。

尝试在您的应用程序或依赖项中找到这样的钩子,并检查删除它是否有帮助。由于您提到这也发生在您的鼠标上,因此还要检查(低级)鼠标挂钩(WH_MOUSE_LL)。MSDN 上列出了可用的挂钩。

于 2020-09-22T23:01:26.927 回答