diff --git a/Resources/Devices.es.resx b/Resources/Devices.es.resx index 30131e9..a2d2cb9 100644 --- a/Resources/Devices.es.resx +++ b/Resources/Devices.es.resx @@ -516,6 +516,12 @@ Hace que todos los procesos compartan el temporizador más fino que pida una aplicación, como en Windows 10. Aumenta el consumo; mantenlo solo si un juego antiguo concreto lo necesita. + + Estado mínimo del procesador bloqueado + + + Una herramienta de ajustes redujo el valor más alto que Windows permite para el estado mínimo del procesador (normalmente 100 %). La configuración queda fija en ese valor, el editor del plan no puede subirla y el ajuste de limitación de la CPU puede fallar. La reparación restablece el límite de Windows del 100 %. + Scripts de Marius Heier diff --git a/Resources/Devices.it.resx b/Resources/Devices.it.resx index 231acca..def3b5d 100644 --- a/Resources/Devices.it.resx +++ b/Resources/Devices.it.resx @@ -516,6 +516,12 @@ Fa condividere a tutti i processi il timer più fine richiesto da un'app, come in Windows 10. Aumenta i consumi; tienilo solo se serve a un vecchio gioco specifico. + + Stato minimo del processore bloccato + + + Un tool di tweak ha abbassato il valore massimo che Windows consente per lo stato minimo del processore (normalmente 100%). L'impostazione resta bloccata su quel valore, l'editor del piano non può alzarla e il tweak sul throttling della CPU può fallire. La correzione ripristina il limite di Windows al 100%. + Script di Marius Heier diff --git a/Resources/Devices.ja.resx b/Resources/Devices.ja.resx index 10673a8..c2e798a 100644 --- a/Resources/Devices.ja.resx +++ b/Resources/Devices.ja.resx @@ -516,6 +516,12 @@ Windows 10 と同様に、いずれかのアプリが要求した最も細かいタイマーをすべてのプロセスで共有させます。消費電力が増えるため、特定の古いゲームで必要な場合のみ維持してください。 + + 最小のプロセッサの状態がロックされています + + + チューニングツールが、最小のプロセッサの状態に Windows が許可する上限値(通常は 100%)を下げています。設定はその値に固定され、電源プランエディターでは上げられず、CPU スロットリングの調整が失敗する場合があります。修復すると Windows の上限 100% に戻ります。 + Marius Heier のスクリプト diff --git a/Resources/Devices.resx b/Resources/Devices.resx index a11ca13..6486ade 100644 --- a/Resources/Devices.resx +++ b/Resources/Devices.resx @@ -516,6 +516,12 @@ Makes every process share the finest timer any app requests, as on Windows 10. It raises power use; keep it only if a specific old game needs it. + + Minimum processor state locked + + + A tweaking tool lowered the highest value Windows allows for minimum processor state (normally 100%). The setting stays stuck at that value, the power plan editor cannot raise it and the CPU throttling tweak may fail. The repair puts the Windows limit of 100% back. + Marius Heier scripts diff --git a/Resources/Devices.ru.resx b/Resources/Devices.ru.resx index 0015b56..451f397 100644 --- a/Resources/Devices.ru.resx +++ b/Resources/Devices.ru.resx @@ -516,6 +516,12 @@ Заставляет все процессы использовать самый точный таймер, запрошенный любым приложением, как в Windows 10. Повышает энергопотребление; оставляйте только если это нужно конкретной старой игре. + + Минимальное состояние процессора заблокировано + + + Утилита твиков снизила максимальное значение, которое Windows допускает для минимального состояния процессора (обычно 100%). Параметр застревает на этом значении, редактор схемы не может его повысить, а твик троттлинга ЦП может не сработать. Исправление возвращает предел Windows в 100%. + Скрипты Marius Heier diff --git a/Resources/Devices.zh-CN.resx b/Resources/Devices.zh-CN.resx index 5248e51..b299246 100644 --- a/Resources/Devices.zh-CN.resx +++ b/Resources/Devices.zh-CN.resx @@ -516,6 +516,12 @@ 使所有进程共享任一应用请求的最高计时器精度(与 Windows 10 相同)。会增加功耗;仅在特定旧游戏需要时保留。 + + 最小处理器状态被锁定 + + + 某个优化工具降低了 Windows 允许的最小处理器状态上限(通常为 100%)。该设置会卡在这个值,电源计划编辑器无法调高它,CPU 节流优化也可能失败。修复会恢复 Windows 的 100% 上限。 + Marius Heier 脚本 diff --git a/Services/TweakCheckService.cs b/Services/TweakCheckService.cs index d20c032..112a307 100644 --- a/Services/TweakCheckService.cs +++ b/Services/TweakCheckService.cs @@ -33,6 +33,9 @@ private TweakCheckService() { } private const string Csrss = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\csrss.exe\PerfOptions"; private const string Dwm = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Dwm"; private const string Mouse = @"HKEY_CURRENT_USER\Control Panel\Mouse"; + // Definition of "Minimum processor state": ValueMax is the highest value any plan may use (Windows default 100). + private const string MinProcessorState = Control + @"\Power\PowerSettingsť33251-82be-4824-96c1-47b60b740d00\893dee8e-2bef-41e0-89c6-b55d0929964c"; + internal const int DefaultProcessorStateMax = 100; internal const int DefaultSvcHostSplitThreshold = 0x380000; internal static readonly string[] BcdTimerValues = ["useplatformclock", "disabledynamictick", "useplatformtick", "tscsyncpolicy"]; private static readonly string[] RawMouseThrottleValues = ["RawMouseThrottleEnabled", "RawMouseThrottleForced", "RawMouseThrottleDuration", "RawMouseThrottleLeeway"]; @@ -100,7 +103,11 @@ .. DeleteExisting(MemoryManagement, "IoPageLockLimit", "CacheUnmapBehindLengthIn ], Show(MemoryManagement, "DisablePagingExecutive", "LargeSystemCache", "IoPageLockLimit", "CacheUnmapBehindLengthInMB"), restart: true), Check("RawMouseThrottle", DeleteExisting(Mouse, RawMouseThrottleValues), Show(Mouse, RawMouseThrottleValues)), - Check("GlobalTimer", DeleteExisting(Kernel, "GlobalTimerResolutionRequests"), Show(Kernel, "GlobalTimerResolutionRequests"), restart: true) + Check("GlobalTimer", DeleteExisting(Kernel, "GlobalTimerResolutionRequests"), Show(Kernel, "GlobalTimerResolutionRequests"), restart: true), + Check("ProcessorStateRange", + Value(MinProcessorState, "ValueMax") is int max && max < DefaultProcessorStateMax + ? [new(MinProcessorState, "ValueMax", DefaultProcessorStateMax)] : [], + Show(MinProcessorState, "ValueMax"), restart: true) }; return checks.Select(check => check with { Managed = ManagedValues(check.Id) }).ToList(); } @@ -120,6 +127,7 @@ private static RegistryValueChange[] ManagedValues(string id) "MemoryManagement" => Values(MemoryManagement, "DisablePagingExecutive", "LargeSystemCache", "IoPageLockLimit", "CacheUnmapBehindLengthInMB"), "RawMouseThrottle" => Values(Mouse, RawMouseThrottleValues), "GlobalTimer" => Values(Kernel, "GlobalTimerResolutionRequests"), + "ProcessorStateRange" => Values(MinProcessorState, "ValueMax"), _ => [] }; } diff --git a/TweakHub.Tests/DevicesLatencyTests.cs b/TweakHub.Tests/DevicesLatencyTests.cs index 2d813f1..c24052b 100644 --- a/TweakHub.Tests/DevicesLatencyTests.cs +++ b/TweakHub.Tests/DevicesLatencyTests.cs @@ -152,7 +152,8 @@ public void TweakChecksFlagBadValuesAndBuildRepairs() [(@"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management", "FeatureSettingsOverride")] = 3, [(@"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management", "LargeSystemCache")] = 1, [(@"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control", "SvcHostSplitThresholdInKB")] = 0x380000, - [(@"HKEY_CURRENT_USER\Control Panel\Mouse", "RawMouseThrottleEnabled")] = 1 + [(@"HKEY_CURRENT_USER\Control Panel\Mouse", "RawMouseThrottleEnabled")] = 1, + [(@"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettingsť33251-82be-4824-96c1-47b60b740d00\893dee8e-2bef-41e0-89c6-b55d0929964c", "ValueMax")] = 0 }; var checks = TweakCheckService.Evaluate(name => values.GetValueOrDefault((name.Key, name.Value)), ["useplatformclock"], "Restricted") .ToDictionary(check => check.Id); @@ -168,10 +169,13 @@ public void TweakChecksFlagBadValuesAndBuildRepairs() Assert.That(checks["AutoTuning"].RepairScript, Does.Contain("autotuninglevel=normal")); Assert.That(checks["ThreadDpc"].Status, Is.EqualTo(TweakCheckStatus.Ok)); Assert.That(checks["InputQueues"].Managed, Has.Count.EqualTo(2), "Undo can find backups even after the repair"); + Assert.That(checks["ProcessorStateRange"].Repair.Single().Value, Is.EqualTo(100), "A lowered limit goes back to the Windows default"); }); var withoutAdmin = TweakCheckService.Evaluate(_ => null, null, "Normal").Single(check => check.Id == "BcdTimers"); Assert.That(withoutAdmin.Status, Is.EqualTo(TweakCheckStatus.NeedsAdministrator)); + Assert.That(TweakCheckService.Evaluate(_ => 100, [], "Normal").Single(check => check.Id == "ProcessorStateRange").Status, + Is.EqualTo(TweakCheckStatus.Ok), "The Windows default is not flagged"); } [Test]