Mr.*_*rub 5 opengl ubuntu windows-10 windows-subsystem-for-linux
我已经使用适用于 Linux 的 Windows 子系统 (WSL) 在 Windows 10 上安装了 Ubuntu。我正在尝试让 OpenGL 图形工作。我的最终目标是能够为需要 OpenGL 的 Robot OS (ROS) 运行 Gazebo 模拟器。作为第一步,我试图确保 OpenGL 图形按预期工作。
根据本教程和许多其他教程,要运行 ROS 和 Gazebo,我应该安装 VcXsrv 并在禁用“本机 OpenGL”选项的情况下运行 X 服务器,所以我正在这样做。
我的直接问题是 OpenGL 似乎工作不正常。我已经安装了 Mesa utils,当我运行时,glxgears我确实看到了图形窗口,但是动画非常慢。我估计齿轮的转动速度约为每分钟 1 转。我可以使用箭头键重新定向齿轮,但更新再次非常缓慢。(如果这很重要的话,时不时会有一个明显的“跳跃”。)
为了进行比较,我尝试glxgears在 VirtualBox 机器上运行的 Ubuntu 上运行。令我惊讶的是,它的动画速度要快得多;齿轮大约每 4 秒旋转一次,而在 Windows 下使用 WSL 运行时每一次(可能是 60 秒,但我失去了耐心)。这是一个很大的惊喜,因为我预计 VirtualBox 会慢得多。
在带有 WSL 的 Windows 上,glxgears声称它运行得非常快——在 800 到 1700 FPS 之间。在 VirtualBox 中glxgears报告大约 900-1000FPS。
glxgears 和 OpenGL 的版本信息:
xxxx@DESKTOP-8U2MCOG:~$ glxgears -info
GL_RENDERER = Software Rasterizer
GL_VERSION = 1.4 (2.1 Mesa 19.2.0-devel (git-cdf42f5eaa))
GL_VENDOR = Mesa Project
GL_EXTENSIONS = GL_ARB_depth_texture GL_ARB_fragment_program GL_ARB_fragment_program_shadow GL_ARB_occlusion_query GL_ARB_texture_env_dot3 GL_ARB_transpose_matrix GL_EXT_draw_range_elements GL_EXT_multi_draw_arrays GL_NV_depth_clamp GL_NV_fog_distance GL_NV_point_sprite GL_SUN_multi_draw_arrays
VisualID 183, 0xb7
20311 frames in 5.0 seconds = 4062.197 FPS
Run Code Online (Sandbox Code Playgroud)
为什么glxgears在 WSL 中运行如此缓慢?如果它应该能够运行得更快,那么我该如何实现呢?
更新
根据下面@allquixotic 的回答,我再次尝试使用该wgl选项运行,我通过选中第二个复选框“Native opengl”来实现。我以前试过这个,但事实证明我需要在重新启动后这样做才能生效。当我glxgears使用此设置运行时,控制台上的读数略有不同:
xxxx@DESKTOP-8U2MCOG:~$ glxgears
Running synchronized to the vertical refresh. The framerate should be
approximately the same as the monitor refresh rate.
23633 frames in 7.5 seconds = 3147.913 FPS
10395 frames in 6.8 seconds = 1529.523 FPS
10395 frames in 6.9 seconds = 1512.829 FPS
Run Code Online (Sandbox Code Playgroud)
现在我很确定我的显示器不会以 1500Hz 的垂直扫描速率运行!所以我认为这可能是真实情况的一个指标;间接渲染系统有些奇怪。我还注意到,当我按 CTRL+C 结束程序时,GL 窗口在我终止程序后继续运行和动画 10-11 秒——如果我只运行程序 3- 4 秒。所以我不得不猜测有大量的消息在排队,或者类似的东西......?
Mr.*_*rub 14
虽然我讨厌成为对自己的问题发表答案的“那个人”,但为了让事情顺利进行,我经历了不止一点点痛苦,我想为下一个人省去同样多的麻烦。所以,这里是
什么实际上结束了工作
出于我不明白的原因,当我违反@allquixotic 的(非常明智的)建议时,我的系统正常工作。
1) 禁用 LIBGL_ALWAYS_INDIRECT
这最终变得非常困难,仅仅因为我必须找到它的设置位置。
\etc\profile.d有一个文件wsl-integration.sh。/usr/share/wslu/wsl-integration.shLIBGL_ALWAYS_INDIRECT中设置了变量,所以我注释掉了那行。2) 不要-wgl对 VcXsrv使用命令行参数(或它的 GUI 等效参数)
由于我是从 GUI 客户端启动 VcXsrv,这意味着不选中第二个选项框,标题为“Native opengl”。
只有在我进行了这两项更改(并重新启动以确保 VcXsrv 的旧设置没有保留)之后,齿轮才会glxgears以正常速度转动,我可以使用箭头键重新调整它们的方向,就像它们一样“重新应该工作。
export LIBGL_ALWAYS_INDIRECT=1.-wgl命令行参数作为命令行参数传递到服务器。在适用于 Linux 的 Windows 子系统 (WSL) 或 Hyper-V 来宾中,硬件加速的 OpenGL 只能通过间接渲染来实现。
GLX 是 X11 客户端-服务器协议的协议扩展。X11 客户端-服务器协议是用于客户端(创建 X 窗口的程序)和服务器(将这些窗口呈现在物理或虚拟屏幕上的程序)之间通信的网络协议。
在桌面Linux 上,GLX 是访问 OpenGL 的标准机制。从客户端程序来看,它基本上是一个两步过程:(1) 与 GLX 对话,然后 (2) 与 OpenGL 对话。第二步取决于您使用的是间接渲染还是直接渲染(即,间接或直接 GLX)。
间接渲染:
LIBGL_ALWAYS_INDIRECT=1大多数程序需要环境变量才能使用它,否则它们默认为直接渲染。直接渲染:
LIBGL_ALWAYS_INDIRECT是未设置。libGL.so(最后是适当的版本,如 libGL.so.1 等)——这些是本机函数调用。有是的OpenGL的实现,支持GLX直接渲染,但是-不知道的是X服务器-管道OpenGL调用在网络上硬件加速远程。这个产品叫做VirtualGL。但是 VirtualGL 没有 Windows 服务器组件,因此无法在 Windows 主机上使用 VirtualGL。如果您在虚拟化中运行 Linux 主机和 Linux 客户机,您可以使用从客户机到主机的 VirtualGL,以使用主机的显卡在客户机中直接渲染。
我不知道“Robot OS”是什么,但如果它只需要 1.4 或更早版本的 OpenGL 命令,那么如果您使用该-wgl命令在 Windows 主机上运行 X 服务器,它应该可以工作。X 服务器需要支持这个标志。我自己从来没有让它与 VcXsrv 一起工作,但我知道 Xming 的付费版本可以工作。
有几个 X 服务器在 Windows 上运行。除了非常昂贵的商业实现之外,我已经测试了其中的大部分。在我看来,最适合 OpenGL 的是 Xming 的付费版本。免费版本已经过时了,也没有那么好。
但是,不存在——不可能存在——在间接渲染模式下(来自 WSL 或 Hyper-V 客户端)支持 OpenGL 1.4 以上的 Windows X 服务器的实现,因为 GLX协议本身没有指定 OpenGL 调用1.4 以上版本。
因此,如果 Robot OS 需要 OpenGL 1.4 以上的版本,则无法在 WSL 或 Hyper-V 中运行它并在 Windows X 服务器上获得硬件加速渲染。你必须使用像 VMware Workstation 这样的东西。
| 归档时间: |
|
| 查看次数: |
11350 次 |
| 最近记录: |