Linux双显卡Wayland环境开应用独显被唤醒的解决方法
正如标题所说,在双显卡笔记本里,无论你使用的是什么Linux发行版,Wayland环境下打开应用总会有点“迟滞感”(延迟感)。这是因为独立显卡被从休眠中唤醒造成的延迟。
速通版:
在/etc/environment文件里添加一行:
__EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json 注销/重启后即可生效。
注意:此方法仅对原生Wayland应用生效,XWayland因为设计问题无法绕过。对于事情来龙去脉感兴趣的可以接着往下看。
详细版:
所以一切都开始于我在Discord里面看到的一句抱怨:
有人在抱怨nautilus(GNOME的文件管理器)打开有延迟。这个问题实际上自从我使用Wayland以来就一直存在的,其原因就是在打开有3D加速功能的应用时,应用会把PCI总线上的设备都扫描一遍,于是独立显卡被唤醒。这就造成了一定的延迟感。 之前我也尝试寻找解决方案,但是硕大的互联网居然搜不出一个解决方案......有点令我诧异。 不过世界上还是大神多呐,马上就有人一针见血的指出了可能存在的问题:是glvnd这个库搞的鬼。(仓库地址:https://gitlab.freedesktop.org/glvnd/libglvnd)具体是干啥的?当一个系统中存在多个可用的OpenGL加速器的时候,就需要这个库来进行抽象,把不同硬件的驱动调用方法给统一起来。 (这个库居然是英伟达开发的,但是也为Intel、AMD、Mesa这些驱动所用,已经事实上是一个公用库了) 然后,在这个库的README里面,有这么一部分(EGL dispatching): 机翻:EGL 不能像 GLX 那样依靠向 X 服务器询问供应商名称,因此它会枚举并加载每个可用的供应商库。还需要加载每个供应商以支持扩展,例如 EGL_EXT_device_enumeration 所以在Wayland下打开原生应用的时候,由于没有直接获取渲染设备的方法,那就只能先扫描一遍PCI总线,确定有哪些可用的设备后,应用才能开启。 值得注意的是,开发者专门为这一部分写了一个小文档(icd_enumeration.md)大佬指出以下这部分可能有帮助: 机翻:如果设置了环境变量 __EGL_VENDOR_LIBRARY_FILENAMES,它是一个以冒号分隔的 JSON 文件名列表。这些文件中描述的 ICD 按给定顺序加载。没有加载其他 ICD 其中所说的文件目录,位于“/usr/share/glvnd/egl_vendor.d/”下,打开可以看见里面有两个文件:一个是英伟达的,另一个是mesa(也就是AMD或者Intel的)。那么按照这个思路,我们可以在系统变量中设置__EGL_VENDOR_LIBRARY_FILENAMES,这样一来,每当EGL应用(原生Wayland应用)开启时,就能直接绕过扫描设备环节。 所以,在/etc/environment文件里添加一行 “__EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json”,重启,打开原生Wayland应用进行测试,应用可以秒开,没有延迟(测试了火狐以及GNOME文件管理器)
那么XWayland什么的有在搞吗...:
直接上结论:nope。因为X11应用在开启之前需要连接所有的GPU设备,那么就不可避免的要唤醒独显。但是如果你跑在原生X11下就不会出现这个情况了(大部分时候不会)。个人猜测:XWayland毕竟不是原生的X11,在原生X11下,扫描GPU这一步可能会在系统开启之前就已经完成了,现在用Wayland替换掉X的底层,那么就不可避免的要重新扫描一遍设备。
有更好的解决方法吗?
辣当然了!但是从开发者专门为这事写个小文档来看,想从底层改动这个机制可能并非容易的事。首先glvnd需要加入相关代码,其次,Wayland协议也需要修改,加入新的protocol。如果想让XWayland也做到的话,那X11的源代码也需要改。 只有哪一天三方开发者都达成共识,一起投入进去才能最终了结这事。毕竟底层protocol的变动不是拍拍脑袋就决定的事(乐