外接副屏帧率大幅度下降

我发现在我的ArchLinux笔记本上游玩游戏时,如果游戏窗口位于外接副屏上,游戏帧率将会急剧下降,伴有频繁帧率大幅波动和延迟。

例如,Minecraft(Linux原生)的帧率从106掉到了38;使用Wine运行的绝区零帧率从稳定60掉到了20帧上下。

系统信息: CPU:12500H
显卡:核显+RTX 3050Ti
主屏为笔记本内建屏幕,2560*1440@144Hz
副屏为1920*1080@60Hz
KDE Plasma Wayland
使用的是prime-run运行的minecraft,驱动使用nvidia-open-dkms

将副屏上的窗口设置为全屏对副屏上的帧率没有改善。似乎所有副屏上的东西都伴有略微更高的延迟,并且帧数明显比主屏低。

我还注意到一点,当游戏窗口位于内置屏幕上时,独显的占用是100%;而当窗口在副屏上时,这个占用率会显著下降,并在50%左右波动。与此同时,CPU和核显占用一直维持在低位,没有异常的高占用。以下是xrandr的输出:

Screen 0: minimum 16 x 16, current 4960 x 1440, maximum 32767 x 32767
eDP-1 connected primary 2560x1440+0+0 (normal left inverted right x axis y axis) 344mm x 193mm
        RANDR Emulation: 1 
        non-desktop: 0 
                supported: 0, 1
   2560x1440    164.90*+
   1920x1440    164.87  
   1600x1200    164.88  
   1440x1080    164.85  
   1400x1050    164.77  
   1280x1024    164.81  
   1280x960     164.80  
   1152x864     164.77  
   1024x768     164.99  
   800x600      164.72  
   640x480      164.26  
   320x240      163.69  
   1920x1200    164.87  
   1680x1050    164.82  
   1440x900     164.74  
   1280x800     164.81  
   1152x720     164.77  
   960x600      164.72  
   928x580      164.51  
   800x500      164.66  
   768x480      164.47  
   720x480      164.67  
   640x400      164.67  
   320x200      161.83  
   2048x1152    164.90  
   1920x1080    164.83  
   1600x900     164.77  
   1368x768     164.98  
   1280x720     164.71  
   1024x576     164.94  
   864x486      164.71  
   720x400      164.23  
   640x350      164.46  
HDMI-A-1 connected 2400x1350+2560+0 (normal left inverted right x axis y axis) 527mm x 296mm
        RANDR Emulation: 1 
        non-desktop: 0 
                supported: 0, 1
   2400x1350     59.93*+
   1600x1200     59.87  
   1440x1080     59.99  
   1400x1050     59.98  
   1280x1024     59.89  
   1280x960      59.94  
   1152x864      59.96  
   1024x768      59.92  
   800x600       59.86  
   640x480       59.38  
   320x240       59.29  
   1920x1200     59.88  
   1680x1050     59.95  
   1440x900      59.89  
   1280x800      59.81  
   1152x720      59.97  
   960x600       59.63  
   928x580       59.88  
   800x500       59.50  
   768x480       59.90  
   720x480       59.71  
   640x400       59.95  
   320x200       58.14  
   2048x1152     59.90  
   1920x1080     59.96  
   1600x900      59.95  
   1368x768      59.88  
   1280x720      59.86  
   1024x576      59.90  
   864x486       59.92  
   720x400       59.27  
   640x350       59.28  

听起来跟这个一样:

可以尝试切换到x11情况是否有改善, 我切换到x11后所有卡顿均消失。后来尝试按这个教程重装后wayland的卡顿也随之消失https://www.bilibili.com/video/BV19DBqB4EY4

应该就是 NVIDIA 的 reverse prime 问题:https://forum.archlinuxcn.org/t/topic/15579/12

具体来说是外接显示器受独显控制,并且你的应用程序运行在独显上,但是合成器运行在核显上,所以需要把画面从独显复制到核显再复制回独显,然后 reverse prime 就是核显到独显这一步有问题,是 NVIDIA 的锅。

不过现在也有人在讨论如何在这种情况下避免来回复制:

看到有人在着手解决了就好……先将就着用吧,独显显存太小不方便开独显直连

如果只是玩游戏的话,其实也可以开个新用户在 tty2 登录,并且直接在独显上跑一个合成器(比如 gamescope 或者 cage 之类的),不玩的时候再切回去 tty1

这个方案居然似乎真的可行。我简单尝试了一下,是可以做到一个tty用核显跑kwin,另一个tty用独显跑gamescope的。只不过输入设备工作得不是很正常,不知道是什么原因,感兴趣的可以折腾一下。

你是用同用户还是不同用户跑的,这两者区别应该是不小的,不过我也还没自己试过换不同用户跑合成器。我对 systemd-logind 在这种情况下如何处理 seat 也不是很了解(

我是相同用户跑的。我只是好奇在两张显卡上同时运行两个混成器是什么样子,不打算深入折腾。