2

我们正在构建一个运行 .NET 5 的 ASP.NET API,它使用 SkiaSharp 动态创建和返回图像。我们注意到使用 GPU 可以显着提高性能。我们知道,为了使用 GPU,我们需要实例化 OpenGL 上下文,但随之而来的是一些要求。我们的测试在我们的环境中运行良好:Mac 和 Windows,但在使用 P1v2 VM 部署到 Linux Azure 应用服务时无法运行。

错误信息Unable to create GL context: Unable to load shared library 'libX11'。做了一些研究,我意识到容器没有OpenGL安装,并且由于缺乏权限而尝试安装它apt-get是不可能的。

我走的是在我的机器上本地运行KuduLite 容器并安装libgl1-mesa-glxmesa-utils的路线,但运行glxinfo导致错误Error: unable to open display。我发现这篇文解释了在 Docker 中运行硬件加速 OpenGL 支持的要求。该博客文章来自 2014 年,所以我不确定它是否仍然有效,但如果有很多要求在我尝试在我的机器上本地解决之前,我想知道它们是否可以在 Azure App 中使用服务容器。

那么,是否有可能在 Azure App Service docker 中提供硬件加速的 OpenGL 支持?

4

1 回答 1

1

您遇到的问题是,您运行它的机器是无头的,并且不运行 X11 显示服务器。大多数与OpenGL 一起使用的应用程序框架都假定它们将在一些交互式图形环境中运行,即具有X11 服务器(配置为使用GPU)或Wayland 合成器。

glxinfo不必为此做任何事情,顺便说一句。它只是一个查询给定 X11 显示器(服务器)具有何种 OpenGL 功能的小工具。如果您一开始不运行 X11,则不需要它。

直到几年前,这实际上是在 Linux 上获得 GPU 加速的唯一方法。幸运的是,那些日子已经一去不复返了。如今,人们可以使用 EGL 获得完全无头、屏幕外的 OpenGL 上下文。Nvidia 有一个关于如何做到这一点的不错的博客:

https://developer.nvidia.com/blog/egl-eye-opengl-visualization-without-x-server/

然后是这个 Github repo:

https://github.com/eduble/gl

你会明白:你得到一个所谓的“表面”并在其上绘图,而不是打开一个窗口。

使用Vulkan,它甚至更简单,因为如果您的目标是将图像渲染到缓冲区并打包在文件中或通过网络发送,您甚至不必费心设置适合推送到显示器的表面 (查看 Sascha Willems 示例中的屏幕外示例https://www.saschawillems.de/creations/vulkan-examples/

于 2021-02-05T18:58:14.057 回答