前言
仅供学习研究。
上个星期在海鲜市场收了一块技嘉超级雕6800XT,准备用来组黑苹果。
系统是Windows 11,到手之后安装了安装显卡驱动和技嘉rgb控制软件rgb fusion 2.0(B22.0414.1,官网最新版),小屏幕倒是挺好看的,但鼠标滑动总觉得时有点卡顿,用鼠标连续画圈最为明显(眼睛比较敏感)。
大约1秒卡顿一次。如下图所示,第一张图正常,第二张图第一个鼠标位置到第二个鼠标位置滑动距离过长,卡顿:
卡顿排查
于是找了一整天原因。从主板BIOS到Windows到AMD驱动,全部排查了一遍。
主板是微星B660M迫击炮WiFi DDR4,尝试BIOS关闭XMP、关闭核心显卡、关闭intel c-state、关闭FTPM 、设置PCIE 3.0,无果。
AMD控制面板关闭网上所说的HDCP,无果。
重装多次AMD驱动,技嘉提供驱动、最新AMD驱动、网吧版驱动,无果。
换了给轮询率低的(125)的鼠标,有一点缓解,但还是会卡,无果。
就在感觉凉凉的时候,把系统从Windows11换到了Windows10,装好开机直奔主题安装AMD驱动,结果不卡顿了,于是在心里骂了Windows 11一百遍。接着我又从Windows 10 OTA到Windows 11,还是不卡顿。
美滋滋的感觉问题解决了,确信是Windows 11的锅。
于是一个个的安装常用软件,正当安装到rgb fusion的时候,卡顿又回来了。
是的,🐕技嘉害我系统没了。
于是打开任务管理器,看到rgb fusion注册的服务MonitorService的CPU一直占用0.5%左右。
停掉服务里的AORUS LCD Panel Service之后,进入”C:\Program Files (x86)\GIGABYTE\AORUS LCD Panel Setting”文件夹,单独运行MonitorService.exe,伴随着显卡实时监控信息的输出,卡顿100%复现了。
解决卡顿
合理猜测MonitorService获取实时显卡监控信息导致的卡顿。一开始图省事,在服务里面直接禁用AORUS LCD Panel Service,鼠标是不再卡顿了,但每次开机后小屏幕上总是一个蛋,忍不了,上ida。
一番定位之后找到了调用获取信息API的地方,大致逻辑是在while循环里每隔1秒检测一次帧率、GPU活动情况、GPU风扇速度,直到控制台窗口发生事件,HandlerRoutine回调内将byte_439C90置为1,循环退出。
我可没心思帮技嘉擦屁股(又菜又不懂Windows开发),既然获取显卡信息卡顿,那就不要获取好了,我只要小屏幕上除GPU监控以外的其它功能能用就行了,总比一直是屏幕上一直是蛋强。
于是使用keypatch插件,修改为在获取帧率的while循环里啥都不干,只sleep 1秒。如下图。
应用patch之后,替换掉MonitorService.exe,卡顿解决。除GPU监控数据不正确,其他功能正常。这次定位问题花费6小时,魔改花费1个小时,总共在这上面花费大半天,好坑。
附修改后的MonitorService.exe。链接: https://pan.baidu.com/s/15PausP6Gjd0rQrCeqXAnvw?pwd=kp62 提取码: kp62。
最后,我也跟技嘉反馈了,等技嘉解决吧。