在 WSL2 里运行带图形界面的程序时,WSLg 已经能把 Linux GUI 窗口直接显示到 Windows 桌面上。我最开始用 WSL2 + Ubuntu 22.04 学习 ROS2,并配合 Gazebo 做仿真,但发现界面渲染很卡,CPU 占用也很高。
排查后发现,图形程序并没有走独立显卡,而是落到了 llvmpipe 软件渲染。网上很多资料讲的是给 WSL 配置 CUDA,用来加速深度学习;但这里的问题不是 CUDA,而是 WSLg 的 OpenGL 渲染后端是否使用了 D3D12/GPU。
目录
现象确认
先安装 glxinfo 所在的工具包:
sudo apt install mesa-utils
然后查看 OpenGL 后端:
glxinfo -B | egrep "Device|Mesa"
如果结果里出现 llvmpipe,通常说明当前是 CPU 软件渲染,例如:
Vendor: Mesa (0xffffffff)
Device: llvmpipe (LLVM 15.0.7, 256 bits) (0xffffffff)
OpenGL vendor string: Mesa
OpenGL core profile version string: 4.5 (Core Profile) Mesa 25.0.1
OpenGL version string: 4.5 (Compatibility Profile) Mesa 25.0.1
OpenGL ES profile version string: OpenGL ES 3.2 Mesa 25.0.1
目标状态应该能看到 D3D12 和具体显卡型号:
Device: D3D12 (NVIDIA GeForce RTX 4060 Laptop GPU) (0xffffffff)
OpenGL core profile version string: 4.6 (Core Profile) Mesa 25.0.1
OpenGL version string: 4.6 (Compatibility Profile) Mesa 25.0.1
OpenGL ES profile version string: OpenGL ES 3.1 Mesa 25.0.1
设置 NVIDIA 作为渲染适配器
在较新的 Ubuntu/Mesa 组合里,WSLg 通常可以直接使用 D3D12 后端。但如果是笔记本双显卡环境,系统可能默认选择核显;这时可以指定优先使用 NVIDIA:
export MESA_D3D12_DEFAULT_ADAPTER_NAME=NVIDIA
如果你的环境仍然回到 llvmpipe,可以再尝试显式指定 Gallium 驱动:
export GALLIUM_DRIVER=d3d12
export MESA_D3D12_DEFAULT_ADAPTER_NAME=NVIDIA
MESA_D3D12_DEFAULT_ADAPTER_NAME 只负责在 D3D12 可用时选择适配器;如果系统根本没有走 D3D12,还需要检查 Mesa、WSLg、Windows 显卡驱动和 WSL 版本。
永久写入环境变量
如果你使用默认的 Bash:
nano ~/.bashrc
如果你使用 Zsh:
nano ~/.zshrc
把需要的环境变量追加到文件末尾:
export MESA_D3D12_DEFAULT_ADAPTER_NAME=NVIDIA
保存后重新加载配置:
source ~/.bashrc
# 或
source ~/.zshrc
如果你同时设置了 GALLIUM_DRIVER=d3d12,也把它写进同一个 shell 配置文件即可。
再次验证
重新打开终端后运行:
glxinfo -B | egrep "Device|Mesa"
看到 Device: D3D12 (NVIDIA ...) 之后,再运行 Gazebo 或其他图形程序,CPU 压力和界面卡顿一般会明显改善。