跳到正文
Petrichor's Blog
返回

WSL2 中为 WSLg 启用 GPU 硬件加速

在 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
Tip

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 压力和界面卡顿一般会明显改善。


分享这篇文章:

上一篇
uv Python 环境管理常用命令
下一篇
在 AstroPaper 主题中添加新文章