Windows控制不同场景和进程使用的电源设置

仅限Windows 11 22H2及以上,并且需要酷睿10代或锐龙桌面端3000系或锐龙移动端5000系及以上,骁龙的不清楚,应该也能用。
用到的脚本:https://wwmq.lanzouy.com/iMpj80ueq6he

Windows 11 22H2开始可以部署不同场景和不同线程使用的设置。(虽然文档说10也有一部分,但是powercfg报错,说明不能用)
不同的场景包括节电模式,游戏模式,还有modern standby用的电源设置,其他的不太重要:

不同进程包括有窗口的前后台进程,EcoQoS,后台服务等:

场景和进程类型能用的电源设置都在这写了,脚本故意去掉了一些没什么用的设置,需要的话也可以手动填:https://learn.microsoft.com/en-us/windows-hardware/customize/power-settings/configure-processor-power-management-options

不同的power profile和QoS level在powercfg里用的alias,注意default就是回落到电源计划或overlay,设置方法不是本文关心的:


文档提到的alias里,ScreenOff是Windows 11 22H2正式版的powercfg目前没有的,可以手动修改xml来部署,脚本里的alias都是目前的Windows 11 22H2正式版有的。

首先必须把当前的电源计划改成平衡类型,之后不能再改了。(怎么处理overlay已经讲过了,powercfg /overlaysetactive overlay_scheme_none禁用电源模式)
(这么做的原因:芯片厂商和OEM只能往平衡计划和overlay写入这些设置,但是不知道为什么实测中它们仍然可以在其他类型的计划里生效;powercfg只能往scheme_balanced里写入这些设置,换成节能计划的scheme_min或高性能计划的scheme_max就会报错;不能改回去是因为自己写的设置在切换电源计划类型后会立刻失效,必须重新设置)
注册表打开HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power,确认EventProcessorEnabled是1,如果是0的话要改成1并重启。
然后,CMD里输入powercfg /queryprofile,查看芯片厂商和OEM往power profiles和QoS level里写了什么设置,如果有什么设置不喜欢的话就记下来。
(不得不提AMD突破物理定律,成功让Zen3+和Zen4在2.5GHz下比2Ghz更省电)


打开Microsoft Store,下载Windows Configuration Designer,点击Provision desktop devices:

填一个喜欢的名字,把路径复制下来,点finish,进入新页面后,往下滑,然后点左下角的switch to advanced editor,然后关闭软件或关闭project,因为待会要重新打开才会加载新的xml:

资源管理器里进入刚刚新建的项目,把customizations.xml删了:









回到Windows Configuration Designer,点export,owner选后3个,保证自己的provisioning package的优先级比微软,芯片厂商和OEM都更高:
(新的xml的默认名字是OEM,这个不重要,owner比OEM级别更高就行)

一路点next,然后点build。回到资源管理器,发现多了一个ppkg文件,双击安装:

然后打开powershell,运行Get-ProvisioningPackage就能确认已经安装上了:


要修改的话,首先到设置的这个地方删除ppkg并重启,然后重做一遍生成xml到导出ppkg的步骤:
(出于不明原因,自主模式会因此关闭,需要注意;并且芯片厂商部署的设置似乎在卸载后仍然会生效,需要清除对应的注册表)

或者直接卸载全部预配包:
Uninstall-ProvisioningPackage -AllInstalledPackages

如果还想快速清除芯片厂商和OEM写的这些设置的话,可以运行这个(当然自己写的设置也会被清除):
(Get-ChildItem -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Power\PowerSettings" -Recurse).Name | ForEach-Object {Remove-ItemProperty -path Registry::$_ -Name "Prov*Index"}
(Get-ChildItem -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Power\PowerSettings" -Recurse).Name | ForEach-Object {Remove-ItemProperty -path Registry::$_ -Name "Override*Index"}
原理是只要删除了名字里带 Prov(ision) 的index就可以使它们失效;有些预装设置用的是名字里带override的index,生成xml的时候会混进去,删了的话干净一些。
(电源计划和overlay里可能也会有一些provision index,不过那些不重要,能走到这一步的人已经足够了解怎么调电源设置了)
可以选择清除单个profile的设置:
# SustainedPerf
Get-ChildItem -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\54533251-82be-4824-96c1-47b60b740d00" -Recurse | ForEach-Object {if ($_ -match "0AABB002-A307-447e-9B81-1D819DF6C6D0"){Remove-Item -Path Registry::$_ -Recurse}}
# MultimediaQos
Get-ChildItem -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\54533251-82be-4824-96c1-47b60b740d00" -Recurse | ForEach-Object {if ($_ -match "0c3d5326-944b-4aab-8ad8-fe422a0e50e0"){Remove-Item -Path Registry::$_ -Recurse}}
# LowLatency
Get-ChildItem -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\54533251-82be-4824-96c1-47b60b740d00" -Recurse | ForEach-Object {if ($_ -match "0DA965DC-8FCF-4c0b-8EFE-8DD5E7BC959A"){Remove-Item -Path Registry::$_ -Recurse}}
# ScreenOff
Get-ChildItem -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\54533251-82be-4824-96c1-47b60b740d00" -Recurse | ForEach-Object {if ($_ -match "2e92e666-c3f6-42c3-89bd-94d40fabcde5"){Remove-Item -Path Registry::$_ -Recurse}}
# EcoQos
Get-ChildItem -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\54533251-82be-4824-96c1-47b60b740d00" -Recurse | ForEach-Object {if ($_ -match "336c7511-f109-4172-bb3a-3ea51f815ada"){Remove-Item -Path Registry::$_ -Recurse}}
# UtilityQos
Get-ChildItem -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\54533251-82be-4824-96c1-47b60b740d00" -Recurse | ForEach-Object {if ($_ -match "33cc3a0d-45ee-43ca-86c4-695bfc9a313b"){Remove-Item -Path Registry::$_ -Recurse}}
# LowPower
Get-ChildItem -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\54533251-82be-4824-96c1-47b60b740d00" -Recurse | ForEach-Object {if ($_ -match "4569E601-272E-4869-BCAB-1C6C03D7966F"){Remove-Item -Path Registry::$_ -Recurse}}
# Standby
Get-ChildItem -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\54533251-82be-4824-96c1-47b60b740d00" -Recurse | ForEach-Object {if ($_ -match "8BC6262C-C026-411d-AE3B-7E2F70811A13"){Remove-Item -Path Registry::$_ -Recurse}}
# EntryLevelPerf
Get-ChildItem -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\54533251-82be-4824-96c1-47b60b740d00" -Recurse | ForEach-Object {if ($_ -match "a4a61b5f-f42c-4d23-b3ab-5c27df9f0f18"){Remove-Item -Path Registry::$_ -Recurse}}
# Background
Get-ChildItem -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\54533251-82be-4824-96c1-47b60b740d00" -Recurse | ForEach-Object {if ($_ -match "c04a802d-2205-4910-ae98-3b51e3bb72f2"){Remove-Item -Path Registry::$_ -Recurse}}
# GameMode
Get-ChildItem -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\54533251-82be-4824-96c1-47b60b740d00" -Recurse | ForEach-Object {if ($_ -match "D4140C81-EBBA-4e60-8561-6918290359CD"){Remove-Item -Path Registry::$_ -Recurse}}
# Constrained
Get-ChildItem -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\54533251-82be-4824-96c1-47b60b740d00" -Recurse | ForEach-Object {if ($_ -match "EE1E4F72-E368-46b1-B3C6-5048B11C2DBD"){Remove-Item -Path Registry::$_ -Recurse}}

原本不想写这个教程的,因为比较繁琐,而且这东西有很大玄学,比如同样是填最大频率1GHz然后跑分,电源计划里填就可以让最大频率锁在1GHz左右,EcoQoS里填就做不到,跑分的那个核大约1.4GHz,其他不跑分的核反而1.1GHz左右。但是还是想把Windows的电源设置涉及的东西讲明白。