前言
年前我在一台 B85 + i7-4790 + RX480 配置的老电脑上安装了macOS 12.7.6 系统。这个硬件组合运行黑果兼容性很好,但是有个小小的问题:我这张RX480显卡风扇启停温度为50°C,所以总是周期性转转停停,倒不如设置一个较低的默认转速。Windows中可以在驱动程序中直接设置,macOS没有对应配置面板,不过可以通过注入 PP_PhmSoftPowerPlayTable 实现。
操作思路
在Windows系统中充分测试,找到合理的 核心电压-核心频率 对应关系,记录备用;
在Windows系统中,导出显卡BIOS;
修改显卡BIOS,编辑 核心电压-核心频率以及风扇参数等内容,然后保存;
从修改后的BIOS中导出PowerPlayTable,转换成opencore能够识别的格式;
在opencore中新建对应配置项并粘贴键值,完成修改;
重启后在macOS系统中执行命令确认修改有效。
Windows测试
对于RX480这种老卡,降频降压可以有效降低发热和噪音,延长使用寿命。在驱动控制面板中即可完成测试,一组常见的核心频率-核心电压对应关系如下:

数据直接来自谷歌AI,用furmark简单测试没有出错,一会儿就用这组数据修改BIOS。
导出BIOS
使用CPU-Z即可。
编辑BIOS
需要用到 RED BIOS Editor ,下载页面 https://www.igorslab.de/en/download-area-new-version-of-morepowertool-mpt-and-final-release-of-redbioseditor-rbe/
主要修改核心频率-核心电压,以及风扇逻辑。
导出PowerPlayTable
需要安装一个名为 upp 的python包,它可以从显卡BIOS文件中提取PowerPlayTable,在Windows中打开cmd命令行:
pip install upp
upp --pp-file=pp_table.bin extract -r 刚才编辑后另存的显卡bios文件这样就得到了名为pp_table.bin的二进制PowerPlayTable文件。
将二进制文件转换成文本
在Windows中打开cmd,运行
certutil -encodehex "C:\path\to\your\pp_table.bin" temp.hex 12得到的temp.hex是一个纯文本文件,可以直接打开查看。我的内容如下:
34030701004D000A060000C82400001900000000800201400D0300E86E0300320032004D0094028B020000B5013B017700F900D101F9020000C402000013032D030000000000000000000000000102000000000000000008000000000000000000000007000100000000000500000000000000000000000010EE02000000000000F80200000000000020030000000000003E030000000000005C030000000000007A030000000000009803000000000000A20300000000000052030000000000008403000000000000B603000000000000E8030000000000001A040000000000004C040000000000007E04000000000000CF030000000000000008840300000000000002FF00000000000003FF00000000000004FF00000000000005FF00000000000006FF00000000000007FF00000000000008FF000000000000010800000030750000000000800000000001E6FF60EA0000000000000000000002E6FF80380100000000008813000003E6FF905F0100000000000000000004E6FFA0860100000000000000000005E6FF289A0100000000000000000006E6FF80B50100000000000000000007000080B50100000000000000000000020052030000E8033075000000000BB6030000E803400D03000000000800000090E20000F824010018F6000000000000A8DE000008B4FF18F6000080380100880D01000000000000FA0000099BFFA0090100084C0100F824010000000000701101000A82FF281D0100A85B0100683C010000000000E02801000B69FFC82C010060670100F04F010000000000683C01000C37FF80380100187301007863010000000000084C01000D05FF38440100D07E01000077010000000000C05701000E0000F04F0100A0860100A086010000000000786301000117000002002500000903A00F64193421D007A00F7017942A016400E4120807F04902004B146400640064006400640064006400011E1F0000046E0000007C007F007F00000000007F005A00000000005E000200690050005000730073005F0000009010960090000006000000000106000001010001010100020101000201010002010100020101010300100000000000000010000000000000021000000000000000010000000000这个长长的字符串就是一会儿要注入opencore的内容
编辑opencore配置文件
之前的操作都在Windows进行,从这一步开始,在macOS中操作。
使用 Hackintool 查看显卡对应的PCI路径,然后使用OCAT挂载EFI分区并打开config.plist配置文件,在DP中新建显卡PCI路径,并为其创建名为PP_PhmSoftPowerPlayTable的Key,类型Data,Value就是刚才得到的很长一串字符。如果这里无法粘贴,可以先保存配置文件,将上面的字符串base64编码后直接粘贴到config.plist对应位置,保存后重启。
检验是否生效
在macOS中打开terminal,运行以下命令:
~ % ioreg -l |grep \"PerformanceStatistics\" | cut -d '{' -f 2 | tr '|' ',' | tr -d '}' | tr ',' '\n'|grep 'Temp\|Fan\|Power\|Clock\|Utilization'
"Device Utilization %"=0
"Fan Speed(%)"=19
"Core Clock(MHz)"=406
"Memory Clock(MHz)"=2000
"Fan Speed(RPM)"=1307
"Temperature(C)"=45
"Total Power(W)"=87
"Device Utilization % at cur p-state"=0
"Device Unit 0 Utilization %"=0
"Device Unit 1 Utilization %"=0
"Device Unit 2 Utilization %"=0
"Device Unit 3 Utilization %"=0
"Device Utilization %"=0修改前我的RX480显卡风扇启停温度为50°C,修改后即便温度未达到50°C也保持了20%左右的最低转速,可见注入有效。
高耗电问题
我注意到这个RX480在macOS中的待机功率太高了,开机什么都不做功率直逼100W。纵然带动1080P 180Hz显示器相对费电,不过Windows中同等工况下显卡功率只有30W左右。reddit 中 GPU RX580 High Usage on Idle MacOS Monterey 这篇帖子似乎描述了类似问题,有空时看看有无解决办法。
GPU RX580 High Usage on Idle MacOS Monterey和黑苹果 AMD GPU 功耗一直很高这两篇文章都提到了黑苹果过高问题,解决办法也都是注入DeviceProperties,办法总结如下:
DeviceProperties -> 显卡 PCIe 路径 -> 添加 -> @0,name 字符类型
填写ATY,Orinoco

我的模拟机型也是iMacPro1,1,据黑苹果 AMD GPU 功耗一直很高一文讲,可以禁用Whatevergreen。另一篇reddit帖子中未提及禁用Whatevergreen,但也反馈注入DeviceProperties降低了一些功率,晚些时候测试下。
更新测试结果
180Hz刷新率是罪魁祸首。测试了60/120/144/165Hz刷新率,显卡功耗变化微乎其微,而且闲置时核心频率、显存频率都能回落到300MHz,但是一旦设置为180Hz,显存频率就会锁死在2000MHz,使得功耗居高不下;
参考网友做法为RX480注入了DeviceProperties,感觉对降低功耗也有助益;
顺手也为HD 4600核显注入了DeviceProperties。这一条感觉没什么用,因为我模拟的是iMacPro 1,1 机型,无法调用核显;
不要禁用Whatevergreen,我测试禁用后黑屏。
经过上述设置,现在显卡闲置时功率在30~40W左右,相较之前足足降低了70W。
我还有一台GA-Z77P-D3 + E3-1230V2 + HD7850 2G的黑果机,同样运行 macOS 12.7.6 ,有空时看下它在180Hz下面功率是否也偏高。
更新:HD7850 在macOS 12.7.6 中,只有在50/60Hz刷新率时,显存频率才能在闲置时回落到150MHz,其余分辨率下均锁死1200MHz。具体功率无法查看,用之前的命令可以正常列出核心频率、显存频率、显卡温度以及风扇转速,但是功率始终为零,估计是显卡自身没有功率传感器吧。翻了下网上的GPU-Z截图:

可见没有GPU功耗监测项。
再对比下RX480的:

看来只能上智能插座了~