如何强制 Unity Editor/TestRunner 在后台全速运行?

如何强制 Unity Editor/TestRunner 在后台全速运行?

我观察到一个奇怪的行为:当编辑器位于前台时,Unity 编辑器(TestRunner)中的处理需要 2.5 秒,但当我立即切换到另一个应用程序时,处理速度就会减慢到 15 秒,从而将编辑器置于后台。

而且:如果我将编辑器放到后台,但不断将鼠标移动到编辑器窗口上,则处理会在与编辑器一直处于前台相同的时间内完成。

我认为这是 Windows(11?)的一些优化,目的是故意减慢后台应用程序的速度。作为最终用户,我找不到针对特定应用或整个系统禁用此功能的方法。是否存在针对最终用户的选项或解决方法?

应用程序开发人员可以采取什么措施来阻止这种行为?

因为我观察到在 VMware 中的 Ubuntu 22 上运行 Unity 编辑器时不存在同样的问题 - 无论我是否将编辑器放在虚拟机的后台,测试总是能快速完成,即使我将整个虚拟机放在后台也不会完成。这让我希望有办法防止这种行为。

仅供参考:整个问题已被记录为向 Jetbrains 报告错误并在Unity 论坛。我希望不必等待任何一个应用程序的修复,我宁愿调整一些系统设置并永久修复这个非常不良的 Windows 行为。

我已经尝试更改以下设置,但无济于事:

  • Unity 编辑器交互模式(首选项 => 常规)设置为“无限制”和“8 毫秒”(120 Hz)
  • 使用任务管理器将 Unity.exe 进程设置为“实时”
  • 禁用“硬件加速 GPU 调度”(设置:系统>显示>图形>默认图形设置)
  • 通过高级系统设置:性能选项 => 高级我设置“调整以获得最佳性能:后台服务”
  • 关闭“游戏模式”
  • 将电源计划设置为“最佳性能”
  • 编写了一个 autohotkey 脚本,每 ms 将鼠标移动 1px,但这只能将执行速度提高 50%(8 秒),并且要求光标位于编辑器窗口上
  • 将 SystemResponsiveness 更改为 64 (100%)(见下文)并添加 NoLazyMode=1(在同一个注册表项中)
  • 禁用 Windows Defender 实时保护(见评论)
  • 通过 powercfg 禁用 unity.exe 的电源限制
  • 在注册表中手动调整 Win32PrioritySeparation

最后两条建议是来自这个超级用户的帖子

临时解决方法: 这是一个奇怪的功能,但在 Unity 2021.2 及更新版本中对我来说很可靠。但是,每次编译脚本/重新加载程序集后都需要手动重新应用它。

  1. 打开首选项:常规 => 忙碌进度延迟
  2. 单击并拖动标签来更改值(只要可以更改,任何值都可以——重要提示:直接在文本字段中输入值是行不通的!)
  3. 运行单元测试并将编辑器置于后台。测试继续快速运行。

我尝试在运行测试之前更改相应的 EditorPrefs 键“EditorBusyProgressDialogDelay”,但这显然不会触发使测试运行得更快的代码。如果有人知道如何反汇编“常规首选项”的编辑器代码,这可能会有所帮助,因为这样我就可以实际调用该方法(可能是内部方法)。

附加说明:设置交互模式无节流通常可以使我的系统上的测试运行速度提高 30%!

答案1

将 OP 错误写出的解决方案粘贴为对他们问题的编辑:

解决方案:下文所述的后台测试运行速度减慢现象在 Unity 2023.1.0b14(测试版)和 2023.2.0a12(alpha 版)中不再出现。我编写了一个脚本,在我的用例中,该脚本通常可将 TestRunner 速度提高约 30%,并将 Rider 中的测试运行速度提高 5 倍(但截至目前,仅在使用 Unity 2023 时)。

这是通过在测试运行期间临时将编辑器交互模式设置为无节流来实现的。当然,您可以手动永久更改此设置 - 但请记住,这将永久且不必要地浪费能源/耗尽电池并增加热量和噪音。

答案2

不知道这是否对您有帮助,但我将此注册表编辑存储在某个地方,据说它可以修改为“后台”或“低优先级”进程保留的 CPU。我认为您应该在此处输入十六进制值,因此“64”代表“100%”。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile]
"SystemResponsiveness"=dword:64
;end

此键包含一个名为 SystemResponsiveness 的 REG_DWORD 值,该值确定应保证分配给低优先级任务的 CPU 资源百分比。例如,如果此值为 20,则 20% 的 CPU 资源将保留给低优先级任务。请注意,不能被 10 整除的值将四舍五入为最接近的 10 的倍数。值 0 也被视为 10。

答案3

如果我理解正确的话,这只会发生在 Unity 中。

由于您已经尝试了 Windows 的所有提高后台任务性能的设置,因此这可能不是 Windows 的问题。您甚至在任务管理器中将优先级设置为实时,这可确保进程具有绝对的 CPU 优先级,但这对这个进程来说还不够。

我的结论是,问题出在流程本身,这是 Unity 错误。我不认为 Windows 可以解决这个问题。

人们也许能够编写一个程序,将 Windows API 消息发送到该进程,使其确信它在后台以前台模式运行,但我不知道有哪个产品可以做到这一点。

相关内容