我已使用適用於 Linux 的 Windows 子系統 (WSL) 在 Windows 10 上安裝了 Ubuntu。我正在嘗試讓 OpenGL 圖形工作。我的最終目標是能夠運行適用於 Robot OS (ROS) 的 Gazebo 模擬器,這需要 OpenGL。第一步,我嘗試確保 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
為什麼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
現在我很確定我的顯示器不能以 1500Hz 的垂直掃描速率運作!所以我認為這可能是真實情況的一個指標;間接渲染系統有些奇怪。我還注意到,當我按 CTRL+C 結束程式時,GL 視窗會在我終止程式後繼續運行並動畫 10-11 秒——如果我只運行該程式 3- 4秒。所以我不得不猜測有大量的消息正在排隊,或者類似的事情......?
答案1
實際效果如何:
由於我不明白的原因,當我違背@allquixotic 的(相當明智的)建議時,我的系統就可以工作。
1. 禁用LIBGL_ALWAYS_INDIRECT
:
這最終變得非常困難,只是因為我必須找到它的設定位置:
- 資料夾裡
/etc/profile.d
有一個文件wsl-integration.sh
。 - 上面的文件實際上是一個符號連結;實際的文件是
/usr/share/wslu/wsl-integration.sh
- 在該文件中設定了變量
LIBGL_ALWAYS_INDIRECT
,因此我註解掉了該行。
2. 做不是對 VcXsrv使用-wgl
命令列參數(或其等效的 GUI):
由於我是從 GUI 用戶端啟動 VcXsrv,這意味著不選取第二個選項框,標題為「Native OpenGL」。
只有當我完成了這兩個更改(並重新啟動以確保 VcXsrv 的舊設定沒有保留)時,齒輪glxgears
才會以正常速度轉動,我可以使用箭頭鍵重新調整它們的方向,就像它們一樣'應該可以工作。
答案2
其實是想解決你的問題
- 在運行需要硬體加速的機器人作業系統程式(例如 glxgears)之前,請執行
export LIBGL_ALWAYS_INDIRECT=1
. - 啟動 VcXsrv(或 Windows 上的任何 X 伺服器)時,將
-wgl
命令列參數作為命令列參數傳遞到伺服器中。 - 如果這不起作用,請嘗試使用付費版本的 Xming 而不是 VcXsrv。
- 如果這仍然不起作用,那你就運氣不好了。請閱讀下文以了解原因。
引擎蓋下的解釋
在適用於 Linux 的 Windows 子系統 (WSL) 或 Hyper-V 來賓中,硬體加速 OpenGL 只能透過間接渲染。
GLX 是 X11 用戶端-伺服器協定的協定擴充。 X11 用戶端-伺服器協定是用於客戶端與伺服器之間通訊的網路協定客戶(建立 X 視窗的程式)和伺服器(將這些視窗渲染到螢幕上的程序,無論是實體的還是虛擬的)。
在桌面Linux中,GLX是存取OpenGL的標準機制。對於客戶端程式來說,它基本上是一個兩步驟過程:(1) 與 GLX 對話,然後 (2) 與 OpenGL 對話。第二步取決於您使用的是間接還是直接渲染(即間接或直接 GLX)。
間接渲染:
- 僅支援 OpenGL 1.4 版(無 GLSL 等)
- 大多數程式需要環境變數
LIBGL_ALWAYS_INDIRECT=1
才能使用它,否則它們預設為直接渲染。 - 使用 GLX 將所有 OpenGL 命令傳送到 X 伺服器協定。
- X伺服器後端使用X伺服器本地的OpenGL實作來完成視窗的渲染。
- 是網路透明的,這意味著它可以透過網路連接和 UNIX 域套接字以及在本地運行。
直接渲染:
- 支援圖形驅動程式支援的任何 OpenGL 版本,如果 OpenGL 發布新版本,最高可達 OpenGL 4.x 或更高版本。
- 要求環境變數
LIBGL_ALWAYS_INDIRECT
為未設定。 - 使用動態載入將所有 OpenGL 命令傳送到可用符號
libGL.so
(末尾帶有適當的版本,如 libGL.so.1 等)——這些是本機函數呼叫。 - X 伺服器不直接「看到」OpenGL 渲染命令。它所看到的只是一個在幀緩衝區中留出的矩形區域,供圖形驅動程式渲染到其中。它不知道什麼被渲染,僅在哪裡。
- 不是網路透明的,這意味著它只能在同一台電腦上本地運行。
那裡是OpenGL 的實現,支援 GLX 直接渲染,但 X 伺服器不知道 - 透過網路將 OpenGL 呼叫傳送到硬體加速遠端。該產品稱為VirtualGL。但 VirtualGL 沒有 Windows 伺服器元件,因此無法在 Windows 主機上使用 VirtualGL。如果您在虛擬化中執行 Linux 主機和 Linux 用戶端,則可以使用從用戶端到主機的 VirtualGL,以使用主機的顯示卡在客戶機中直接渲染。
我不知道「機器人作業系統」是什麼,但如果它只需要 1.4 或更早版本的 OpenGL 命令,那麼當您使用該-wgl
命令在 Windows 主機上運行 X 伺服器時,它應該可以工作。 X 伺服器需要支援該標誌。我自己從來沒有讓它與 VcXsrv 一起工作,但我知道 Xming 的付費版本可以工作。
有多個 X 伺服器在 Windows 上運行。除了非常昂貴的商業實現之外,我已經測試了其中的大多數。在我看來,最適合 OpenGL 的是 Xming 的付費版本。免費版本已經過時而且不太好。
然而,不存在——不能存在——Windows X 伺服器的實現,它將在間接渲染模式(從 WSL 或 Hyper-V 用戶端)中支援 OpenGL 1.4 以上的版本,因為 GLX協議本身不指定1.4以上版本的OpenGL呼叫。
因此,如果機器人作業系統需要 OpenGL 1.4 以上,則有無論如何都沒辦法在 WSL 或 Hyper-V 中運行它並在 Windows X 伺服器上獲得硬體加速渲染。你必須使用VMware Workstation之類的東西。
答案3
遇到了同樣的問題,並發現 glxgears 很可能只是用如此快的繪製請求壓倒了 VcXsrv,以至於根本無法渲染任何內容。
詳細資訊和帶有幀速率限制選項的 glxgears 修改版本如下:
https://github.com/tobecodex/glxgears
使用此版本,我可以輕鬆地在 Surface Book 2 上獲得 > 800 fps 的齒輪。
我猜測現代顯示器上缺乏真正的 VSYNC 速率會導致 glxgears 盡可能快地向伺服器發送垃圾郵件,從而殺死 VcXsrv。
我注意到 MeshLab 和類似的程式運作得很好,而 Xming 沒有這個問題(雖然也沒有硬體加速)。
所以回答你的問題:不用擔心。 Gazebo 可能會運作得很好。該問題僅存在於 glxgears 和類似版本的應用程式中。
順便說一句,我發現:export LIBGL_ALWAYS_INDIRECT
和 的 -wgl
任何組合對我來說影響不大。可能值得再次使用這些,因為結果幾乎肯定會與您在 glxgears 中看到的結果不同。