4

我注意到,当 Windows 在(至少我的)多核机器上(不是在虚拟机中)播放声音时,不同程序的执行有时会延迟半秒。我测试了 3 种不同的计算机硬件配置。我还编写了一个小型 c++ 测试应用程序来重现此问题。它只是计算内存中几兆字节的废话并输出为此花费的时间。这是在循环中完成的,因此您可以不断获得输出。我上传了这个测试程序(包括自我编译的源代码,例如使用 MinGW 的 GCC 4.7.2,如果你担心可执行文件中有恶意软件)到这里:http ://daiw.de/share/PrintCalculationTimes.zip

在以下屏幕截图中,您可以看到在程序执行时播放声音(通过控制面板中的声音设置)会发生什么:http: //daiw.de/share/PrintCalculationTimesWithoutSound.png

http://daiw.de/share/PrintCalculationTimesWithSoundWithAnnotations.png (不是每次点击播放按钮都会发生这种情况,但多次点击很容易在我的测试 PC 上重现。)

这是一个众所周知的问题吗?有人可以用我提供的测试用例证实这一观察吗?

感谢您的关注。

多比

4

1 回答 1

3

我看到的是 16 毫秒的抖动,而不是半秒的延迟。此外,我看到它独立于正在播放的任何声音(即使在您的屏幕截图中似乎也是如此)。

如果播放一些声音也会阻止(非背景优先)线程运行,那真的会让我感到惊讶。对于数以千计的电脑游戏来说,这将是一个严重的问题,所有这些游戏都需要流畅的动画和始终播放声音。

考虑到 16 毫秒是您在系统上使用的计时器的默认分辨率,结果一点也不奇怪。这正是您所期望的。

如果有的话,请尝试std::chrono::high_resolution_clock改用,或者timeBeginPeriod(1)在程序的开头放一个(需要-lwinmm)。

(请注意,这timeBeginPeriod(1)会使调度程序更频繁地全局执行,不仅在您的程序中,而且不仅在程序的生命周期内。如果您使用笔记本电脑并使用电池运行,您可能需要在测试后重新启动以节省电池。通常,一个人会使用 重置为正常endTimePeriod(1),但由于终止进程是结束你的程序的唯一方法,这不起作用。)

于 2012-12-03T11:39:40.970 回答