Visual Studio在调试时出现极大的延迟问题

3
当我在VS2012中调试应用程序并且它崩溃时,输入设备(鼠标和键盘)开始极其缓慢,帧率下降到0.3或更低,我甚至不能移动鼠标而不用等待3秒钟...唯一的解决方案是使用Shift-F5结束调试,然后一切都恢复正常。
更有趣的是,唯一出现滞后的是输入设备,整个背景完全正常,文本插入符号以正常速率闪烁,当鼠标移到按钮上时,工具提示也可以很好地进行动画处理。
我正在使用 allegro 4.2 编译该项目(我必须使用它,否则需要花费太长时间来解释为什么)。
我的电脑很快,没有安装扩展程序,应该能够处理调试...
我对任何解决方案都感兴趣,即使是肮脏/ hackish 的...如果需要,我当然可以提供更多信息。
感谢任何帮助。
编辑:通过阅读论坛,我发现了一些关于“自动”窗口(或类似窗口)的信息(不记得确切名称,也找不到了),它正在执行一些“后台任务”,这会导致滞后...您认为在单独的核心上运行它会修复问题吗?
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 (我不记得合作和排他级别是否有影响——也许试着更改这些会有所帮助。)

很有帮助。我希望这可以解决问题。我目前不在,所以当我回家后,第一件事就是检查它是否解决了问题。看起来可能是这个原因。谢谢! - noisy cat
这是您需要的答案,先生。非常有帮助和好的回答。根据检查源代码,DirectInput 可能会导致延迟 - 无论如何,我认为使用 SFML 重写整个程序比修复旧的 Allegro 更快更容易... - noisy cat
感谢您提供有关DirectInput的提示,结果证明这正是我的问题所在。虽然将其设置为使用模拟鼠标没有帮助,但我将协作级别从“DISCL_FOREGROUND|DISCL_NONEXCLUSIVE”更改为“DISCL_FOREGROUND|DISCL_EXCLUSIVE”,问题得到了解决。 - Grant Peters

4

我最近在调试一个游戏时遇到了类似的问题:

  • 遇到断点,程序停止以进行调试。
  • 现在按下任何键都需要大约1秒钟的时间来“处理”。它将被缓冲并逐个发送到当前活动的窗口。

在我的情况下,应用程序使用 SetWindowsHookEx(WH_KEYBOARD_LL, ...) 安装了低级键盘钩子。移除它后(仅在 !NDEBUG 构建中,如您所愿),输入延迟消失了。

我猜测在你的应用程序被暂停时,这个钩子根本无法响应,最终系统会在超时后跳过它。这个超时的长度可以在毫秒级别下使用 HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout:DWORD 配置,如 此处 所述。实际上,被接受的答案中提到了这个问题的链接,但是我认为在这里解释一下核心问题,因为链接在我修复之前已经失效了。

尝试在你的应用程序或依赖项中查找这样的钩子,并检查是否移除它有所帮助。由于你提到这也发生在鼠标上,请检查 (低级别) 鼠标钩子 (WH_MOUSE_LL)。可用的钩子在 MSDN 上列出


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接