NOTE: Designed by GPT-6 Astra Created by GPT-6.1 Sol
引言
在 WSL2 的 Ubuntu 20.04 中运行 ROS1,使用 RViz 可视化点云时,发现窗口交互明显卡顿。执行下面的命令检查 OpenGL:
glxinfo -B | grep -E 'Device:|Accelerated:|OpenGL renderer'
输出如下:
Device: llvmpipe (LLVM 12.0.0, 256 bits) (0xffffffff)
Accelerated: no
OpenGL renderer string: llvmpipe (LLVM 12.0.0, 256 bits)
这说明当前 OpenGL 使用的是 CPU 软件渲染。点云仍然可以显示,但大量绘制工作落在 CPU 上,成为卡顿的一个明确原因。
本次处理有两个前提:现有代码依赖 ROS1,需要继续使用当前 Ubuntu 20.04 环境;保留现有点云显示需求,不通过减少显示数据来绕开问题。
最终的解决方法是:将新版 glibc、C++ 运行库和配套动态加载器解包到用户目录,仅在启动 RViz 时使用这套库,让 Intel 的 WSL 图形驱动能够正常加载。 系统的 Ubuntu、ROS、Mesa 和基础库保持原来的版本。
这篇博客记录实际排查过程,包括为什么第一次补运行库仍然失败,以及最后的启动脚本如何工作。
博客开始前先给出验证的结果吧:
rviz-gpu --check
# name of display: :0
# display: :0 screen: 0
# direct rendering: Yes
# Extended renderer info (GLX_MESA_query_renderer):
# Vendor: Microsoft Corporation (0xffffffff)
# Device: D3D12 (Intel(R) Arc(TM) B390 GPU) (0xffffffff)
# Version: 21.2.6
# Accelerated: yes
# Video memory: 48609MB
# Unified memory: yes
# Preferred profile: core (0x1)
# Max core profile version: 3.3
# Max compat profile version: 3.1
# Max GLES1 profile version: 1.1
# Max GLES[23] profile version: 3.0
# OpenGL vendor string: Microsoft Corporation
# OpenGL renderer string: D3D12 (Intel(R) Arc(TM) B390 GPU)
# OpenGL core profile version string: 3.3 (Core Profile) Mesa 21.2.6
# OpenGL core profile shading language version string: 3.30
# OpenGL core profile context flags: (none)
# OpenGL core profile profile mask: core profile
# OpenGL version string: 3.1 Mesa 21.2.6
# OpenGL shading language version string: 1.40
# OpenGL context flags: (none)
# OpenGL ES profile version string: OpenGL ES 3.0 Mesa 21.2.6
# OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00
rviz-gpu --check | grep -E 'Device:|Accelerated:|OpenGL renderer'
# Device: D3D12 (Intel(R) Arc(TM) B390 GPU) (0xffffffff)
# Accelerated: yes
# OpenGL renderer string: D3D12 (Intel(R) Arc(TM) B390 GPU)
问题分析
本机 Intel Arc B390 的 Windows WSL 驱动使用较新的 Linux 运行库。
逐层检查发现 libigd12umd64.so 要求 GLIBC_2.34,
libigd12um64xe3.so 要求 GLIBC_2.38,libigdgmm_w.so.12 要求 GLIBCXX_3.4.32。
系统仍为 Ubuntu 20.04、glibc 2.31、Mesa 21.2.6。
启动器:~/.local/bin/rviz-gpu
生效运行库:~/.local/share/rviz-wsl-gpu/runtime-noble/
只解包官方 .deb 到用户目录,没有通过 dpkg/apt 安装,没有修改系统库或 shell 配置。
旧的 runtime/ 和 runtime-2.39/ 是诊断过程中保留的试验目录,启动器不使用它们。
使用方式
先像平常一样 source ROS/workspace,然后运行:
rviz-gpu --check
rviz-gpu
rviz-gpu -d /home/kwanwaipang/GRG-Cortex-Omni/src/grgslam/config/grgslam.rviz
--check 应显示 Accelerated: yes 及 D3D12 (Intel(R) Arc(TM) B390 GPU)。
普通 glxinfo、rviz、rosrun rviz rviz 仍然使用系统运行库;专用启动器才启用修复。
若 PATH 未包含 ~/.local/bin,使用启动器的绝对路径即可。
roslaunch 中仅给 RViz 节点添加以下属性,保留原有 args 和显示配置:
launch-prefix="$(env HOME)/.local/bin/rviz-gpu"
若原属性是 launch-prefix="nice",可以改为:
launch-prefix="nice $(env HOME)/.local/bin/rviz-gpu"
也可以不改项目 launch 文件:原来的 roslaunch grgslam slam_online.launch 命令
增加 rviz:=false,再在另一个已 source 工作空间的终端使用上面的 rviz-gpu -d ...。
一、先记录实际环境
本次排查使用的环境如下,版本以 2026 年 10 月 31 日的检查结果为准:
| 项目 | 实际结果 |
|---|---|
| Windows | Windows 11,Build 26200 |
| GPU | Intel Arc B390 |
| Windows 显卡驱动 | 32.0.101.9150 |
| Linux 发行版 | Ubuntu 20.04.6 LTS,x86_64 |
| WSL 内核 | 6.18.54.1-microsoft-standard-WSL2 |
| WSLg | 1.0.79 |
| ROS | ROS Noetic |
| RViz | 1.14.26 |
| Qt / OGRE | 5.12.8 / 1.9.0 |
| 用户发行版 Mesa | 21.2.6 |
| 系统 glibc | 2.31 |
| 系统 libstdc++6 | 10.5.0-1ubuntu1~20.04 |
其中,glibc 和 libstdc++ 是后面定位问题的关键。不能只看到 Mesa 比较旧,就直接认定升级 Mesa 能解决。
1.1 查看 Linux 侧的信息
cat /etc/os-release
uname -r
getconf GNU_LIBC_VERSION
dpkg-query -W libc6 libstdc++6 libgcc-s1 libgl1-mesa-dri
printenv DISPLAY WAYLAND_DISPLAY XDG_RUNTIME_DIR
printenv LIBGL_ALWAYS_SOFTWARE MESA_LOADER_DRIVER_OVERRIDE GALLIUM_DRIVER
本机没有设置强制软件渲染的环境变量;显示变量中有 DISPLAY=:0 和 WAYLAND_DISPLAY=wayland-0。
1.2 查看 Windows 侧的显卡信息
在 Windows PowerShell 中执行:
Get-CimInstance Win32_VideoController |
Select-Object Name, DriverVersion, DriverDate, Status |
Format-List
结果确认显卡是 Intel Arc B390,驱动状态为 OK。
二、理解 WSLg 的 OpenGL 加速路径
WSLg 下的 OpenGL 加速可以简化为以下调用关系:
ROS1 RViz / OGRE
|
v
OpenGL / Mesa
|
v
Mesa D3D12 Gallium 驱动
|
v
WSL 的 Direct3D 接口和厂商用户态驱动
|
v
Windows GPU 驱动与 GPU
Microsoft 的 WSLg 文档说明,OpenGL 加速通过 Mesa 的 D3D12 Gallium 驱动实现;Mesa 的 D3D12 驱动会把相关图形操作转换为 Direct3D 12 API 调用。WSLg 官方说明、Mesa D3D12 文档
所以,修复后的渲染器显示成 D3D12 (Intel...) 是正常的,并不需要显示成原生 Linux 下的 Intel OpenGL 驱动名称。
这里还有两个容易误判的地方:
direct rendering: Yes本身不能证明启用了 GPU;本次软件渲染时,这一项同样是Yes。llvmpipe输出中的256 bits不能作为显卡已经参与渲染的依据。判断本次问题时,应结合渲染器名称和Accelerated字段。
三、确认 GPU 接口和 Mesa 驱动是否存在
首先检查 WSL 的 GPU 接口及相关库:
ls -l /dev/dxg
ls -l /usr/lib/wsl/lib/libdxcore.so
ls -l /usr/lib/wsl/lib/libd3d12.so
ls -l /usr/lib/wsl/lib/libd3d12core.so
ls -l /usr/lib/x86_64-linux-gnu/dri/d3d12_dri.so
ldconfig -p | grep -E 'dxcore|d3d12'
本机的 /dev/dxg 存在,WSL 提供的 Direct3D 库也存在,而且动态库缓存能够找到它们。Ubuntu 自带的 Mesa 21.2.6 已经包含 d3d12_dri.so。
这说明需要继续检查驱动的初始化过程,不能直接归因于“没有 GPU 接口”或“没有安装 D3D12 后端”。
排查时也遇到过受限执行环境无法连接 DISPLAY=:0、看不到实际 /dev/dxg 的情况。切换到能够访问实际 WSL 图形服务的终端后,接口正常存在。因此,受限终端中的访问失败,需要与 WSL 主环境中的设备缺失区分开。
四、强制使用 D3D12,找到被隐藏的加载错误
先启用 Mesa 的加载日志:
LIBGL_DEBUG=verbose glxinfo -B
再仅对当前命令指定 D3D12:
GALLIUM_DRIVER=d3d12 LIBGL_DEBUG=verbose glxinfo -B
第二条命令没有恢复加速,而是出现了:
libGL error: failed to create dri screen
libGL error: failed to load driver: swrast
X Error of failed request: BadValue
这些信息还不足以定位根因。虽然日志提到了 swrast,但不能仅凭这一行就认定是缺少软件渲染驱动。继续打开动态链接器的诊断信息:
GALLIUM_DRIVER=d3d12 LD_DEBUG=libs,versions \
glxinfo -B > /tmp/glxinfo-loader.log 2>&1
grep -E 'not found|version lookup error|libigd|libdxcore|libd3d12' \
/tmp/glxinfo-loader.log
这次终于出现了明确的错误:
version `GLIBC_2.32' not found
(required by .../libigd12umd64.so)
加载器已经找到了 /usr/lib/wsl/lib/libdxcore.so、libd3d12.so 和 Windows 显卡驱动目录中的 libigd12umd64.so,但系统 glibc 缺少它要求的符号版本。
本机系统库是:
getconf GNU_LIBC_VERSION
glibc 2.31
还可以用 readelf 查看驱动声明的版本依赖。下面用通配符查找驱动文件,避免把本机特定的驱动目录后缀写死:
for driver in /usr/lib/wsl/drivers/iigd_dch.inf_amd64_*/libigd12umd64.so; do
readelf --version-info "$driver" |
grep -E 'Name: (GLIBC_|GLIBCXX_|CXXABI_)'
done
这一步发现主驱动还需要 GLIBC_2.34 和 GLIBCXX_3.4.29。因此,只补上报错中第一个出现的 GLIBC_2.32 并不够。
此时可以确定:本次硬件加速失败,至少存在 Intel WSL 用户态驱动与 Ubuntu 20.04 基础运行库不兼容的问题。
五、为什么第一次补运行库仍然失败
为了保留原系统,首先尝试从 Ubuntu 22.04 的官方软件包中提取 glibc 2.35 和较新的 C++ 运行库,放进用户目录,再通过配套加载器运行 glxinfo。
这次主驱动能够加载了,但继续加载 Xe3 驱动时又失败:
version `GLIBC_2.38' not found
(required by .../libigd12um64xe3.so)
于是改用 glibc 2.39。主驱动和 Xe3 驱动都通过后,显存管理库又报错:
version `GLIBCXX_3.4.32' not found
(required by .../libigdgmm_w.so.12)
整个过程可以整理成下面的表格:
| 尝试 | 已通过的部分 | 剩余问题 |
|---|---|---|
| 系统原有 glibc 2.31 | 找到 WSL 图形接口 | 主驱动缺少所需 glibc 符号版本 |
| 独立 glibc 2.35 + GCC 12 运行库 | 主驱动加载成功 | Xe3 驱动需要 GLIBC_2.38 |
| 独立 glibc 2.39 + GCC 12 运行库 | 主驱动、Xe3 驱动加载成功 | 显存管理库需要 GLIBCXX_3.4.32 |
| 独立 glibc 2.39 + GCC 14 运行库 | 完成本次图形驱动初始化 | glxinfo 和 RViz 确认使用 GPU |
这里的 GLIBC_* 来自 glibc;GLIBCXX_* 来自 libstdc++。两个名字相近,但对应不同的运行库。
这也解释了为什么只看第一条报错,很容易低估所需运行库的版本。Intel 图形驱动会继续动态加载其他组件,必须检查整条实际加载路径。
六、最终方案:给 RViz 配置独立运行库
最终使用三个 Ubuntu 官方软件包:
| 软件包 | 本次使用的版本 | 用途 |
|---|---|---|
| libc6 | 2.39-0ubuntu8.9 | glibc 和配套动态加载器 |
| libstdc++6 | 14.2.0-4ubuntu2~24.04.1 | 满足新驱动的 C++ 符号版本要求 |
| libgcc-s1 | 14.2.0-4ubuntu2~24.04.1 | 配套 GCC 运行库 |
这些包来自 Ubuntu 24.04 的官方仓库,但这里只把文件解包到用户目录,没有把 Ubuntu 20.04 升级为 24.04,也没有在系统中安装这些跨发行版软件包。
最终生效的目录结构为:
~/.local/
├── bin/
│ └── rviz-gpu
└── share/
└── rviz-wsl-gpu/
├── packages/
├── runtime-noble/
│ └── usr/lib/x86_64-linux-gnu/
│ ├── ld-linux-x86-64.so.2
│ ├── libc.so.6
│ ├── libm.so.6
│ ├── libstdc++.so.6
│ └── libgcc_s.so.1
└── logs/
runtime-noble 只是便于识别软件包来源的目录名,系统发行版仍然是 Ubuntu 20.04。
6.1 下载官方软件包
下面保留本次实际使用的版本,便于复现。后续版本可能变化,可以先查看 libc6 下载页、libstdc++6 下载页 和 libgcc-s1 下载页,核对文件名与 SHA256。
这些命令应在 Ubuntu 20.04 的 Bash 中执行,下载的包是 amd64 架构:
rviz_gpu_base="$HOME/.local/share/rviz-wsl-gpu"
mkdir -p "$rviz_gpu_base/packages" "$rviz_gpu_base/runtime-noble"
cd "$rviz_gpu_base/packages"
curl -fL --connect-timeout 15 --max-time 60 \
-o libc6-noble.deb \
'https://security.ubuntu.com/ubuntu/pool/main/g/glibc/libc6_2.39-0ubuntu8.9_amd64.deb'
curl -fL --connect-timeout 15 --max-time 60 \
-o 'libstdc++6-noble.deb' \
'https://security.ubuntu.com/ubuntu/pool/main/g/gcc-14/libstdc++6_14.2.0-4ubuntu2~24.04.1_amd64.deb'
curl -fL --connect-timeout 15 --max-time 60 \
-o libgcc-s1-noble.deb \
'https://security.ubuntu.com/ubuntu/pool/main/g/gcc-14/libgcc-s1_14.2.0-4ubuntu2~24.04.1_amd64.deb'
下载之后核对 SHA256,下面的值对应上述三个固定版本:
sha256sum --check <<'EOF'
ff5557d99b51f761c4b7c92368b9cc45565eda17df9bf9eb4b134d09825008be libc6-noble.deb
a51f8de7829211db961a31f02158058ad1a95f92ac6d0a5dff6350e2821c54c0 libstdc++6-noble.deb
aa7fadbe33b78bcf99885318040601c550c208929565b179891d9a3cc2aa68cd libgcc-s1-noble.deb
EOF
三项都显示 OK 后,再继续解包。如果更换软件包版本,也要同步更新对应的官方 SHA256。
NOTE:
软件包与下载元数据保存在
packages/。这些独立库不由系统 apt 自动更新。
6.2 只提取文件,不安装到系统
继续在同一个终端执行:
dpkg-deb -x libc6-noble.deb "$rviz_gpu_base/runtime-noble"
dpkg-deb -x 'libstdc++6-noble.deb' "$rviz_gpu_base/runtime-noble"
dpkg-deb -x libgcc-s1-noble.deb "$rviz_gpu_base/runtime-noble"
这里使用的是 dpkg-deb -x,只提取软件包里的文件。整个步骤不需要 sudo,也不执行软件包安装脚本,不会把这三个包登记为系统已安装版本。
不要把这一步改成 sudo dpkg -i,也不要手动覆盖 /lib/x86_64-linux-gnu/libc.so.6。本次方案依赖“保留系统运行库、显式选择独立运行库”这一点。
6.3 先用独立加载器运行 glxinfo
rviz_gpu_runtime="$HOME/.local/share/rviz-wsl-gpu/runtime-noble/usr/lib/x86_64-linux-gnu"
"$rviz_gpu_runtime/ld-linux-x86-64.so.2" \
--library-path "$rviz_gpu_runtime:/usr/lib/wsl/lib" \
/usr/bin/glxinfo -B
这次实际得到的输出是:
Vendor: Microsoft Corporation (0xffffffff)
Device: D3D12 (Intel(R) Arc(TM) B390 GPU) (0xffffffff)
Version: 21.2.6
Accelerated: yes
OpenGL renderer string: D3D12 (Intel(R) Arc(TM) B390 GPU)
OpenGL version string: 3.1 Mesa 21.2.6
Mesa 仍然是原来的 21.2.6,但已经能够使用 GPU。 这说明本机此次回退到软件渲染的直接障碍,是驱动所需的运行库依赖,而不是必须先升级 Mesa。
七、为什么需要显式调用动态加载器
正常执行一个动态链接的 Linux 程序时,系统会按照 ELF 文件中记录的解释器路径启动动态加载器。仅把新版 libc.so.6 放在某个目录里,并不会自动让程序正确使用整套新版运行库。
本次做法是直接调用新版 glibc 自带的加载器:
独立的 ld-linux-x86-64.so.2
|
+-- 优先使用独立 glibc / libstdc++ / libgcc
|
+-- 加载系统中的 RViz、Qt、OGRE、Mesa
|
+-- 加载 WSL 提供的 Direct3D 接口和 Intel 驱动
加载器自身的帮助中可以看到:
"$rviz_gpu_runtime/ld-linux-x86-64.so.2" --help
其中 --library-path 用于为此次启动指定动态库搜索路径,--argv0 用于设置被启动程序看到的 argv[0]。
之所以使用 --library-path,而不把新版 glibc 路径全局写入 .bashrc 的 LD_LIBRARY_PATH,是为了把影响限制在这次启动的程序。若把新版 glibc 路径导出给所有后续程序,它们仍可能通过系统旧加载器启动,形成加载器和 glibc 混用的问题。
需要准确理解这里的“独立”:它是为一个进程显式选择部分运行库,并不是容器或完整的新发行版。RViz 仍然会使用系统中的其他依赖,所以最终还需要用实际 RViz 验证兼容性。
八、封装成 rviz-gpu 启动脚本
为了避免每次都输入一长串加载器参数,将最终启动逻辑保存到:
~/.local/bin/rviz-gpu
如果目录尚不存在,先执行 mkdir -p "$HOME/.local/bin"。
下面是本次实际使用的完整脚本:
#!/bin/bash
# Private runtime for the Intel WSL graphics driver; system libraries stay intact.
set -e
runtime="$HOME/.local/share/rviz-wsl-gpu/runtime-noble/usr/lib/x86_64-linux-gnu"
loader="$runtime/ld-linux-x86-64.so.2"
if [[ ! -x "$loader" ]]; then
echo "RViz GPU runtime not found: $loader" >&2
exit 1
fi
if [[ "${1:-}" == "--check" ]]; then
shift
binary=/usr/bin/glxinfo
set -- -B "$@"
else
# Source the base ROS environment only if the caller has not sourced it.
if [[ "${ROS_DISTRO:-}" != "noetic" ]]; then
source /opt/ros/noetic/setup.bash
fi
binary=/opt/ros/noetic/lib/rviz/rviz
# Also support roslaunch's launch-prefix, which supplies the executable.
case "${1:-}" in
/opt/ros/noetic/bin/rviz|/opt/ros/noetic/lib/rviz/rviz)
binary="$1"
shift
;;
esac
fi
# --library-path applies to this executable; do not export a replacement glibc
# through LD_LIBRARY_PATH, which would break children using the system loader.
library_path="$runtime:/usr/lib/wsl/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export GALLIUM_DRIVER=d3d12
exec "$loader" --argv0 "$binary" --library-path "$library_path" "$binary" "$@"
保存后赋予执行权限,并做一次 Bash 语法检查:
chmod +x "$HOME/.local/bin/rviz-gpu"
bash -n "$HOME/.local/bin/rviz-gpu"
这个脚本主要处理了以下几个问题:
--check会用同一套独立运行库执行glxinfo -B,方便确认硬件加速状态。- 正常启动时,执行的是原来的 ROS Noetic RViz 二进制。
- 动态库搜索路径优先放置独立运行库和
/usr/lib/wsl/lib,再追加调用者已有的 ROS/workspace 库路径。 - 仅在脚本进程中设置
GALLIUM_DRIVER=d3d12。它负责指定渲染后端,真正解决依赖问题的是配套运行库。 - 通过
exec交接给加载器,脚本进程不继续驻留,方便 roslaunch 管理节点生命周期。 - 兼容 roslaunch 的
launch-prefix调用方式,能够识别 roslaunch 传入的 RViz 可执行文件路径。
对于项目自己的 RViz 插件,仍然应先像平常一样 source 工作空间。脚本只会在未检测到 Noetic 环境时补充基础 ROS 环境,不会自动判断应该 source 哪一个自定义工作空间。
九、独立启动与 roslaunch 的接入方式
9.1 直接启动 RViz
source /opt/ros/noetic/setup.bash
# 有自定义插件时,再 source 对应工作空间。
# source "$HOME/your_catkin_ws/devel/setup.bash"
"$HOME/.local/bin/rviz-gpu" --check
"$HOME/.local/bin/rviz-gpu"
加载原有的 .rviz 配置文件:
"$HOME/.local/bin/rviz-gpu" -d /path/to/your/config.rviz
如果 ~/.local/bin 已经在 PATH 中,就可以直接输入 rviz-gpu。
9.2 在 roslaunch 中使用
给原有 RViz 节点增加 launch-prefix,保留原来的参数和显示配置。例如:
<node pkg="rviz" type="rviz" name="rviz"
launch-prefix="$(env HOME)/.local/bin/rviz-gpu"
args="-d $(find your_package)/config/your_config.rviz"/>
其中 your_package 和配置文件路径应替换为原项目实际内容。
如果原节点已经使用 nice,可以组合:
launch-prefix="nice $(env HOME)/.local/bin/rviz-gpu"
roslaunch 会把 RViz 可执行文件和节点参数传给前缀命令。脚本识别并移除这个可执行文件参数,然后使用独立加载器启动原来的 RViz,后续参数继续原样传递。
本次修复没有直接修改项目 launch 文件。另一种使用方法是让项目关闭自动启动的 RViz,再单独运行 rviz-gpu -d ...。例如本机项目已有 rviz 开关参数,可以使用 rviz:=false;其他项目是否支持这个参数,需要检查其 launch 文件。
十、验证不能只停留在 glxinfo
glxinfo 恢复加速之后,还实际启动了 ROS1 RViz,确认 Qt、OGRE、Mesa 和 Intel 驱动能够共同工作。
本次验证使用独立 ROS master,避免依赖正在运行的项目。测试脚本创建了一个临时 .rviz 配置,订阅固定坐标系为 map 的 sensor_msgs/PointCloud2,并发布合成点云。
| 检查项 | 实际结果 |
|---|---|
| glxinfo 硬件加速 | Accelerated: yes |
| glxinfo 渲染器 | D3D12 (Intel(R) Arc(TM) B390 GPU) |
| RViz / Qt / OGRE | 1.14.26 / 5.12.8 / 1.9.0 |
| 合成点云 | 每帧 100,000 点 |
| 发布节奏 | 约 10 Hz,持续 15 秒 |
| RViz 状态 | 保持订阅,进程存活,没有崩溃 |
| 运行结束 | 测试 RViz 和独立 ROS master 已关闭 |
RViz 的实际日志包含:
rviz version 1.14.26
compiled against Qt version 5.12.8
compiled against OGRE version 1.9.0 (Ghadamon)
GL_RENDERER = D3D12 (Intel(R) Arc(TM) B390 GPU)
OpenGL device: D3D12 (Intel(R) Arc(TM) B390 GPU)
OpenGl version: 3.1 (GLSL 1.4).
也检查了 RViz 进程的 /proc/<pid>/maps,确认相关 Intel 驱动文件实际加载到了 RViz 进程中。
本机保留的验证日志位于:
~/.local/share/rviz-wsl-gpu/logs/rviz-test-20261031-215712/rviz.log
如果要查看自己后续运行时的渲染器,可以在启动 RViz 时启用 OGRE 日志:
"$HOME/.local/bin/rviz-gpu" -l -d /path/to/your/config.rviz
这里需要明确测试结果的边界:10 Hz 是合成点云的发布频率,不是测得的 RViz 渲染帧率。 本次没有测量真实项目的 FPS、丢帧率或性能提升倍数,也没有运行实际 SLAM 算法、回放真实 rosbag 或逐一验证自定义插件。已经确认的是:CPU 软件渲染问题被修复,ROS1 RViz 能使用 GPU 并保持接收测试点云。
十一、为什么普通 glxinfo 仍然可能显示 llvmpipe
本次修复只通过专用启动器生效,所以检查时需要区分:
| 启动方式 | 使用的运行库 |
|---|---|
glxinfo -B |
系统默认运行库 |
rviz / rosrun rviz rviz |
系统默认运行库 |
rviz-gpu --check |
独立运行库下的 glxinfo |
rviz-gpu |
独立运行库下的 ROS1 RViz |
使用上述 launch-prefix 的 RViz 节点 |
独立运行库下的 ROS1 RViz |
因此,普通 glxinfo 继续显示 llvmpipe,并不代表专用启动器失效。应使用 rviz-gpu --check,并结合实际 RViz 的渲染器日志确认。
修复后再次检查系统软件包,仍然得到:
glibc 2.31
libgl1-mesa-dri 21.2.6-0ubuntu0.1~20.04.2
libstdc++6 10.5.0-1ubuntu1~20.04
如果需要停用这套方案,改回原来的启动方式,并去掉新增的 launch-prefix 即可;系统库本身不需要恢复。
独立提取的运行库不会由系统 apt 自动更新。以后 Windows 显卡驱动更新后,若又出现加载失败,应重新查看 LD_DEBUG=libs,versions 的输出,核对新增的符号版本要求。本次的三个包和脚本是在上述机器及版本组合下验证通过的方案,其他硬件或插件组合仍需要实际验证。