前言
直接说结果,结论是没有解决方法,这是由 macOS 对内存/显存的管理模式决定的,属于“正常情况”,并不是“问题”,所以不需要“解决”。详细说明如下。
macOS High Sierra 10.13 后期,苹果公司准备引入自家图形 API:Metal,这个东西定位类似 Windows 平台的 DirectX,以弥补 macOS 平台长期只有 OpenCL 的不足。自 macOS Mojave 10.14 起,Metal 被正式引入,作为主要的图形 API。从那时开始,macOS 对于显存的管理方式发生了很大变化,简单来说,就是从类似于 Windows 的静态系统(Static)转变为类似 UNIX 对内存使用的压力系统(Pressure),自 10.14 版本开始 macOS 的诸多功能和软件均使用了 Metal API,例如 Safari,随便打开几个网页,显存用量就会提升。当使用量达到最大物理容量上限时,macOS 会自动释放不再需要的显存空间,以容纳新的数据。另一部分原因在于 AMD,他们为 Mac 平台编写的驱动程序,对数据的处理模式,各功能的实现方式。
也许这也是苹果公司不愿意和 NVIDIA 继续合作的原因之一,近几年来 NVIDIA 在产品力方面一直比同期的 AMD 要强势,并且一直希望在 macOS 全面推广他的 CUDA 通用计算,也不太愿意为苹果公司不多的订单量去承担更多的定制工作,另一方面,苹果一直致力于打造软硬件结合的生态圈闭环,类似 iOS 的强势闭环生态圈,苹果希望完全掌控 macOS 生态的方方面面。
回到正题,因为显存管理模式的改变,在 iStat Menus 等监控软件中经常会出现满载,典型表现是使用率长期维持在 95-99%,实际上 macOS 只是把使用过的数据临时保存到显存以备二次使用,这个设计可以提升瞬时响应速度。在系统正常运行时,既不会出现显存泄漏也没有卡顿问题。如果你的黑苹果/白苹果运行正常,安心使用即可,这个设计不会对硬件产生损害或对稳定性产生影响。反而你应该高兴,你花了重金购买了昂贵的显卡,如果有方法能让它为你工作提升性能,为什么要让它闲着?
对于有强迫症的同学,下面介绍一种便捷的清空方法。
便捷清空方法
「注意」方法治标不治本,综上所述也没法治本。
打开系统偏好设置,它一般位于你的 Dock 栏,或启动台中:
依次找到「桌面与屏幕保护程序」→「屏幕保护程序」→「触发角」。
选择一个不会影响你使用的屏幕边角,设置其功能为“将显示器置入睡眠状态”,然后退出即可。
接下来直接将鼠标挪到设置的触发角,屏幕会立即进入睡眠状态(但不是系统休眠),按键盘任意键即可恢复原有显示状态。如果你有多个屏幕,触发角就是最边上那个显示器的边角。
显示器睡眠后无法正常恢复的黑苹果,可以尝试添加 igfxonln=1 到启动参数,如无特殊需求,推荐使用 DisplayPort 连接显示器。
效果验证
在显示器睡眠并唤醒后,显存的占用会接近清空:
但是这并没有什么用,治标不治本,使用浏览器随便开几个网页使用率就回来了。所以,如果你在使用过程中,显卡核心并没有无故长时间满载,也没有遇到其它性能问题,就无需担心,它好着呢。最后附一个苹果官方社区的相关问答链接,最佳答案得到了苹果官方的推荐。
除非你发现性能问题,否则我不会担心这一点。macOS 尝试优化内存的使用——我猜显存也一样。它可能会在使用后将东西保存在显存中,如果发生这种情况,可以重复使用。只要在需要时释放显存用于其他用途,就可以了。
几点其它说明
- AMD 的显卡,RX4X0、RX5X0、RX Vega,尤其是 R9 2XX - R9 3XX 这几代显卡,在功耗控制方面确实不如同时期的 NVIDIA,在 Windows 上还不是特别的明显,但在 macOS 上,尤其是当接入了多个屏幕并且分辨率不一样时,例如一个 4K 使用 HiDPi 缩放至 1440P,再搭配一个 1080P 副屏时,闲置线程(idle)会至始至终将显卡的核心频率和显存频率锁定到最大值,并因此导致待机功耗飙升。Q群管理 @XIII 曾和笔者提到,使用 RX570 接入两个屏幕时,待机功耗始终维持在 65W~73W 附近,使用功耗仪实测证实确实差的不多,可参考 TechPowerUp 这篇文章;
- 综上各方面的原因,这几代 AMD 显卡,总体能耗控制表现都非常差,无论是白苹果还是黑苹果,直到 Navi 时代才有改观;
- 显存占用现象自 macOS Mojave 10.14 开始就一直不断有人提出,但根源在于系统,无法解决;
- RX 580 冻屏问题网络上解决方法各式各样,有成功的也有非常玄学的,但就是没有 100% 肯定能解决问题的。笔者没有这款显卡也没有经历过类似问题,经整理认为以下几个方向可以考虑:
- 使用 Debug 版本 VirtualSMC.kext 并加入启动参数 -vsmcdbg,如果在 Debug 日志中发现如下内容:WhateverGreen: igfx @ found an unsupported processor 0x0:0x0,加入启动参数 -wegoff 可解决问题,即放弃 WEG 的功能;
- 尝试刷入蓝宝石的 VBIOS,具体可参考「RX580 2048SP 刷 VBIOS 的方法」,例文显卡不同,但刷 VBIOS 方法通用;
- 如果是重负载场景冻屏,考虑到目前在售的 RX480 和 RX580 几乎都是矿卡,首先考虑 VBIOS 问题(可能被刷入了为挖矿优化的 VBIOS),其次考虑散热老化问题,更换导热垫和硅脂,在 Windows 系统使用 AIDA64 或 FurMark 进行显卡压力测试,如果无法通过,考虑核心或显存损坏可能;
- 尝试更换不同品牌/型号的 NVMe 或 SATA 固态硬盘;
- 尝试对内存进行稳定性测试,排除内存颗粒损坏的可能性;
- 根据 WhateverGreen 开发堆栈里 OC 团队注释的内容,Polaris 核心变体为 Ellesmere 的 AMD PC 显卡( RX560XT/470D/470/480/580)在 10.15 及以上版本的系统中的驱动损坏,系统会卡死在 .gpuRestart 导致冻屏,出处见这个链接;
评论(0)