![Windows 10(WSL)의 Ubuntu에서 OpenGL 문제를 해결하는 방법](https://rvso.com/image/1605171/Windows%2010(WSL)%EC%9D%98%20Ubuntu%EC%97%90%EC%84%9C%20OpenGL%20%EB%AC%B8%EC%A0%9C%EB%A5%BC%20%ED%95%B4%EA%B2%B0%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
WSL(Linux용 Windows 하위 시스템)을 사용하여 Windows 10에 Ubuntu를 설치했습니다. OpenGL 그래픽을 작동시키려고 합니다. 나의 궁극적인 목표는 OpenGL이 필요한 로봇 OS(ROS)용 Gazebo 시뮬레이터를 실행할 수 있게 되는 것입니다. 첫 번째 단계로 OpenGL 그래픽이 예상대로 작동하는지 확인하려고 합니다.
에 따르면이 튜토리얼ROS와 Gazebo를 실행하려면 VcXsrv를 설치하고 "Native OpenGL" 옵션을 비활성화한 상태에서 X 서버를 실행해야 하므로 그렇게 하겠습니다.
내 즉각적인 문제는 OpenGL이 제대로 작동하지 않는 것 같습니다. Mesa 유틸리티를 설치했고 실행하면 glxgears
그래픽 창이 표시되지만 애니메이션이 매우 느립니다. 기어가 분당 1회전 정도 회전하는 것으로 추정됩니다. 화살표 키를 사용하여 기어 방향을 바꿀 수 있지만 업데이트 속도가 매우 느립니다. (가끔 눈에 띄는 "점프"가 나타나는 경우가 있습니다.)
비교를 위해 glxgears
VirtualBox 시스템에서 실행되는 Ubuntu에서 실행해 보았습니다. 놀랍게도 애니메이션이 훨씬 빠르게 진행됩니다. WSL을 사용하는 Windows에서 실행할 때 기어는 매 4초마다 한 번씩(어쩌면 60초 정도지만 인내심을 잃었습니다) 완전히 회전합니다. VirtualBox가 훨씬 느려질 것으로 예상했기 때문에 이것은 큰 놀라움입니다.
WSL이 있는 Windows에서는 glxgears
800~1700FPS 사이의 매우 빠른 속도로 실행된다고 주장합니다. 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에서 실행 속도가 너무 느린 이유는 무엇입니까 ? 더 빠르게 실행될 수 있어야 한다면 어떻게 해야 합니까?
업데이트
wgl
아래 @allquixotic의 답변을 바탕으로 두 번째 확인란 "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~3초 동안만 실행한 경우입니다. 4초. 그러면 대기 중인 메시지가 엄청나게 많다거나 그런 것이 아닐까 추측해야 겠죠...?
답변1
실제로 효과가 있었던 것은 무엇입니까?
이해할 수 없는 이유로 @allquixotic의 (매우 합리적인) 권장 사항에 반하여 실행했을 때 내 시스템이 작동했습니다.
1. 비활성화 LIBGL_ALWAYS_INDIRECT
:
이 작업은 정말 어려웠습니다. 왜냐하면 설정 위치를 찾아야 했기 때문입니다.
- 폴더 안에는
/etc/profile.d
파일이 있었습니다wsl-integration.sh
. - 위 파일은 실제로 심볼릭 링크였습니다. 실제 파일은
/usr/share/wslu/wsl-integration.sh
- 해당 파일에 변수가
LIBGL_ALWAYS_INDIRECT
설정되었으므로 해당 줄을 주석 처리했습니다.
2. 해라~ 아니다-wgl
VcXsrv에 대해 명령줄 인수(또는 이에 상응하는 GUI)를 사용합니다 .
GUI 클라이언트에서 VcXsrv를 시작했기 때문에 이는 "Native OpenGL"이라는 두 번째 옵션 상자를 선택하지 않은 상태로 두는 것을 의미했습니다.
두 가지 변경 사항을 모두 적용하고 VcXsrv에 대한 이전 설정이 유지되지 않았는지 확인하기 위해 새로 재부팅한 후에야 기어가 glxgears
정상적인 속도로 회전하고 화살표 키를 사용하여 방향을 바꿀 수 있었습니다. 다시 일해야 해.
답변2
실제로 문제를 해결하려고 노력 중입니다.
- glxgears와 같이 하드웨어 가속이 필요한 로봇 OS 프로그램을 실행하기 전에
export LIBGL_ALWAYS_INDIRECT=1
. - VcXsrv(또는 Windows의 모든 X 서버)를 시작할 때
-wgl
명령줄 인수를 명령줄 인수로 서버에 전달합니다. - 그래도 작동하지 않으면 VcXsrv 대신 Xming 유료 버전을 사용해 보세요.
- 그래도 작동하지 않는다면 대부분 운이 없는 것입니다. 이유를 알아보려면 아래를 읽어보세요.
후드 아래에 대한 설명
WSL(Linux용 Windows 하위 시스템) 또는 Hyper-V 게스트 내에서 하드웨어 가속 OpenGL은 다음을 통해서만 가능합니다.간접 렌더링.
GLX는 X11 클라이언트-서버 프로토콜의 프로토콜 확장입니다. X11 클라이언트-서버 프로토콜은 클라이언트-서버 간 통신에 사용되는 네트워크 프로토콜입니다.클라이언트(X 윈도우를 생성하는 프로그램) 및서버(물리적이든 가상이든 해당 창을 화면에 렌더링하는 프로그램)
~에데스크탑Linux, GLX는 OpenGL에 액세스하기 위한 표준 메커니즘입니다. 클라이언트 프로그램에서는 기본적으로 2단계 프로세스입니다. (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 렌더링 명령을 직접 "확인"하지 않습니다. 보이는 것은 그래픽 드라이버가 렌더링할 수 있도록 프레임 버퍼에 별도로 설정한 직사각형 영역뿐입니다. 그것은 모른다무엇렌더링됩니다.어디.
- 네트워크 투명하지 않습니다. 즉, 동일한 컴퓨터에서만 로컬로 작동합니다.
거기~이다GLX 직접 렌더링을 지원하지만 X 서버에는 알려지지 않은 OpenGL 호출을 네트워크를 통해 하드웨어 가속 원격 장치로 연결하는 OpenGL 구현입니다. 이 제품은 VirtualGL이라고 합니다. 그러나 VirtualGL에는 Windows 서버 구성 요소가 없으므로 Windows 호스트에서 VirtualGL을 사용할 방법이 없습니다. 가상화에서 Linux 호스트와 Linux 게스트를 실행 중인 경우 게스트에서 호스트로 VirtualGL을 사용하여 호스트의 그래픽 카드를 사용하는 게스트에서 직접 렌더링을 얻을 수 있습니다.
"로봇 OS"가 무엇인지는 모르지만 버전 1.4 이하의 OpenGL 명령만 필요한 경우 해당 -wgl
명령을 사용하여 Windows 호스트에서 X 서버를 실행하면 작동할 것입니다. X 서버는 이 플래그를 지원해야 합니다. 나는 VcXsrv와 함께 작동하도록 해본 적이 없지만 Xming의 유료 버전이 작동한다는 것을 알고 있습니다.
Windows에서 실행되는 여러 X 서버가 있습니다. 나는 정말 비용이 많이 드는 상용 구현을 제외하고 대부분을 테스트했습니다. 제 생각에는 OpenGL에 가장 적합한 버전은 Xming의 유료 버전입니다. 무료 버전은 다소 구식이며 좋지 않습니다.
그러나 존재하지 않습니다.할 수 없다존재 - 간접 렌더링 모드(WSL 또는 Hyper-V 클라이언트에서)에서 OpenGL 1.4 이상을 지원하는 Windows X 서버의 구현입니다.프로토콜 자체버전 1.4 이상의 OpenGL 호출을 지정하지 않습니다.
따라서 Robot OS에 OpenGL 1.4 이상이 필요한 경우절대 안돼WSL 또는 Hyper-V에서 실행하고 Windows X 서버에서 하드웨어 가속 렌더링을 얻으려면 VMware Workstation과 같은 것을 사용해야 합니다.
답변3
동일한 문제에 직면하여 glxgears가 그리기 요청으로 VcXsrv를 압도할 가능성이 너무 빨라 아무 것도 렌더링할 수 없다는 것을 알아냈습니다.
프레임 속도 제한 옵션이 포함된 glxgears의 세부 정보 및 수정된 버전은 다음과 같습니다.
https://github.com/tobecodex/glxgears
이 버전을 사용하면 Surface Book 2에서 800fps 이상의 기어를 쉽게 얻을 수 있습니다.
최신 디스플레이에 실제 VSYNC 속도가 없으면 glxgear가 가능한 한 빨리 서버에 스팸 메일을 보내 VcXsrv를 죽일 수 있다고 추측합니다.
나는 MeshLab과 유사한 것이 잘 작동하고 Xming에는 이 문제가 없다는 것을 알았습니다(또한 HW 가속도 없습니다).
따라서 귀하의 질문에 대한 답변은 다음과 같습니다. 걱정하지 마십시오. Gazebo는 아마도 잘 작동할 것입니다. 문제는 glxgear 및 아마도 비슷한 빈티지의 앱에만 존재합니다.
export LIBGL_ALWAYS_INDIRECT
그런데 나는 어떤 조합으로 도 -wgl
나에게 거의 영향을 미치지 않는다는 것을 발견했습니다 . 결과가 glxgears에서 본 결과와 거의 확실히 다르기 때문에 다시 시도해 볼 가치가 있습니다.