远程桌面,openGL

x11、xserver看另一篇博客


openGL是一种规范,用于绘制图像

OpenGL是Khronos Group开发维护的一个规范(也就是提供了一种接口),它主要为我们定义了用来操作图形和图片的一系列函数的API,需要注意的是OpenGL本身并非API。

GPU的硬件开发商则需要提供满足OpenGL规范的实现,这些实现通常被称为“驱动”,它们负责将OpenGL定义的API命令翻译为GPU指令。

OpenGL用于绘制图形

当然,如果硬件开发商的某款显卡无法在硬件上支持OpenGL所定义的所有功能,那么硬件开发商就必须通过软渲染的方式提供这种功能。

综上,OpenGL并非一个能够直接安装的库或包,它只是一个规范。我们只需要安装显卡的驱动即可,因为显卡驱动中就包括了对OpenGL规范的实现。

什么是Mesa和GLX

众所周知,OpenGL作为图形界的工业标准,其仅仅定义了一组2D和3D图形接口API,而对于窗口管理、IO消息响应等并没有规定。也就是说,OpenGL依赖各平台提供用于渲染的context以及具体实现方式,而各平台提供的实现不尽相同。这些实现主要有:Windows平台下的WGL、Linux下的Mesa/GLX、Mac OS X下的Cocoa/NSGL,以及跨平台的GLUT、GLFW、SDL等等。

Mesa是Linux下的OpenGL实现。它提供了对AMD Radeon系列、Nvidia GPU、Intel i965, i945, i915以及VMWare虚拟GPU等多种硬件驱动的支持,同时也提供了对softpipe等多种软件驱动的支持。Mesa项目由Brian Paul于1993年8月创建,于1995年2月发布了第一个发行版,此后便受到越来越多的关注,如今Mesa已经是任何一个Linux版本首选的OpenGL实现。

GLX则是在Linux上用于提供GL与窗口交互、窗口管理等等的一组API。它的作用与Windows的WGL、Mac OS X的AGL以及针对OpenGL ES的EGL相似。在Linux上,窗口创建、管理等API遵循X Window接口,而GLX提供了OpenGL与X Window交互的办法。因此GLX也可以运用于其他使用X Window的平台,例如FreeBSD等。

LIBGL_ALWAYS_INDIRECT=1 

永远启用间接渲染。

间接渲染意味着将使用 GLX 协议来传输 OpenGL 命令,而 X.org 将进行真正的绘制。(X.org 接收到命令后调用windows的GPU进行绘制)

直接渲染意味着应用程序可以直接访问硬件,而无需先通过 mesa 与 X.org 通信。x客户端直接向windows的GPU发送命令进行绘制。

直接呈现速度更快,因为它不需要将上下文更改为 X.org 进程。

直接渲染wiki

在经典的X Window System架构中,X Server 是唯一可以独占访问图形硬件的进程,因此也是在帧缓冲区上进行实际渲染的进程。X 客户端所做的就是与 X 服务器通信以分派渲染命令。这些命令是独立于硬件的,这意味着X11 协议提供了一个抽象图形设备的API,因此 X 客户端不需要知道或担心底层硬件的细节。任何硬件特定代码都存在于Device Dependent X中,X Server 中管理每种类型的视频卡或图形适配器的部分,通常也称为视频图形驱动程序

3D 渲染的兴起已经显示了这种架构的局限性。3D 图形应用程序往往会产生大量命令和数据,所有这些都必须分派到 X Server 进行渲染。作为进程间通信量X 客户端和 X 服务器之间的 (IPC) 增加,3D 渲染性能受到影响,以至于 X 驱动程序开发人员得出结论,为了利用最新显卡的 3D 硬件功能,需要一种新的无 IPC 架构。X 客户端应该可以直接访问图形硬件,而不是依赖第三方进程来这样做,从而节省所有 IPC 开销。这种方法称为“直接渲染”,与经典 X 架构提供的“间接渲染”相对。Direct Rendering Infrastructure最初是为了允许任何 X 客户端使用这种“直接渲染”方法执行 3D 渲染而开发的。

直接渲染模式需要OpenGL应用程序能够直接访问GPU(可以简单地认为OpenGL应用程序与GPU需要在同一台电脑上),而间接渲染则需要将OpenGL指令转发至X Window Server,由X Window Server负责执行真正的OpenGL指令。

澄清:在这两种情况下,渲染都是由 GPU 完成的(或技术上 - 可能由 GPU 完成)。然而在间接渲染过程中看起来像:

  1. 程序调用命令
  2. 命令通过 GLX 协议发送到 X.org
  3. X.org调用硬件(即GPU)进行绘制

在直接渲染中

  1. 程序调用命令
  2. 命令被发送到 GPU

也就是​OpenGL​命令少了一个人接手,也就是X.org

请注意,由于 OpenGL 的设计方式可以在网络上运行,因此间接渲染比架构的简单实现更快,即允许一次发送大量命令。然而,在上下文切换和处理协议所花费的 CPU 时间方面存在一些开销。

一个例子:WSL使用远程桌面的gnome。

command line - Opening Ubuntu 20.04 Desktop on WSL2 - Ask Ubuntu

我在 WSL 下获得“完整桌面”的首选方法是使用xrdp然后简单地运行 Windows 远程桌面连接以进入桌面管理器。这避免了 Ubuntu 和 Windows 之间的热键冲突。不利的一面是,它比使用本机 WSLg 慢一点。

最初的问题提到了“Ubuntu Desktop”(假设是 Gnome)和 Xfce,因此我将提供两者的步骤。Xfce 是两者中比较容易的,因为它不需要Systemd

请注意,此更新后的答案已在 Ubuntu 22.10 和 WSL2 版本 1.0.3 上进行了测试。

Xfce

sudo apt install xrdp xfce4
# If asked, select lightdm, although it probably doesn't matter

# Optionally, back up the default config
sudo cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.bak

# Windows Pro and higher are often already running RDP on 3389
# Prevent conflicts:
sudo sed -i 's/3389/3390/g' /etc/xrdp/xrdp.ini

# Prevent Wayland from being used in Xrdp
echo "export WAYLAND_DISPLAY=" > ~/.xsessionrc

# Optional, if you only have one desktop environment installed
echo startxfce4 > ~/.xsession 

sudo service xrdp start
# Or, if running Systemd
sudo systemctl restart xrdp

就是这样——您应该能够使用内置的远程桌面连接应用程序连接到您的 WSL 桌面。要连接的计算机将是localhost:3390。确保选择 Xorg 作为会话类型。


gnome桌面

随着 WSL 最近使用 Systemd 的能力,这已经变得更加“开箱即用”。我不确定我是否会“推荐它”,但这当然是可能的。

首先,启用 Systemd。重启 Ubuntu 后,确保 Systemd 正在运行sudo systemctl status

接下来的几个步骤与 Xfce 的类似:

# Block ACPI features, which cause issues in WSL2, from being installed with Gnome
sudo apt-mark hold acpid acpi-support

sudo apt install ubuntu-desktop xrdp

# Optionally, back up the default config
sudo cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.bak

# Windows Pro and higher are often already running RDP on 3389
# Prevent conflicts:
sudo sed -i 's/3389/3390/g' /etc/xrdp/xrdp.ini

# Optional if you only have one desktop environment installed
echo gnome-session > ~/.xsession 

指令解答

sudo apt-mark hold acpid acpi-support

关闭一些特性

sudo apt install ubuntu-desktop xrdp

安装gnome桌面、xrdp

xrdp

  • 我们看到,XRDP是RDP(远程桌面协议)的一个版本(同时当然也是基于x11协议),允许Windows以外的操作系统的用户远程连接到另一台计算机。在RDP的工作中,不同类型的网络技术被用来进行成功的无缝互动。在这个过程中,不同类型的数据通过多个独立的渠道在网络上安全地进行通信。
  • 通过3389端口(默认情况下),RDP协议向用户提供远程访问。使用该端口,应用程序和服务包(已启用RDP)被传输,允许微软通信服务将数据引导到RDP通道。然后,操作系统对RDP数据进行加密,使其能够被添加到传输的框架中。现在是终端服务设备重定向器(TSDR)的任务,处理RDP协议活动。

也就是我们要在wsl上开启一个xrdp的服务(客户端),这样本地就能通过xrdp协议与wsl进行通信,进而可以访问远程桌面,在xrdp上运行GNOME桌面,并控制他。(本地要开启服务端,在3390,远程也在3390)

sudo cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.bak

备份xrdp.ini的配置文件,可选,该配置文件当然会在etc目录下。

sudo sed -i 's/3389/3390/g' /etc/xrdp/xrdp.ini

如果是windows pro会在本机的3389创建了一个xrdp,防冲突我们要新建xrdp。

windows使用查看端口占用

netstat -ano|findstr 3390

linux查看端口

sudo  netstat -tunlp | grep 3390

 两个系统使用的都是netstat命令,管道一个是grep,一个是findstr

sed 也就是替换命令,将3389全部换为3390

  • “ s/ ”代表匹配文本中提到的字符/模式出现的“替代”。
  • “ /g ”指的是替换文本中特定字符/模式的“全局”。

echo gnome-session > ~/.xsession 

xsession 应该就是开启x11桌面时选择的桌面环境。

如今,大多数 X 显示管理器都会让您选择一个会话。选择特定的会话会启动特定的桌面环境、会话管理器、窗口管理器。然后执行的只是那个 DE/SM/WM 以及它根据它选择读取的任何配置文件选择启动的任何程序。许多环境提供读取传统~/.xsession.

就是启动x11桌面环境将自动开启gnome-session


~/.xsessionrc使用以下内容创建:

export GNOME_SHELL_SESSION_MODE=ubuntu
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
export XDG_DATA_DIRS=/usr/share/ubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop
export WAYLAND_DISPLAY=
export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg

然后:

sudo systemctl restart xrdp

与 Xfce4 一样,您应该能够使用内置的远程桌面连接应用程序连接到 Gnome 桌面。要连接的计算机将是localhost:3390。确保选择 Xorg 作为会话类型,为什么能映射到本地的3390,挺神奇的。

猜你喜欢

转载自blog.csdn.net/zxyOVO/article/details/130409723