linux - 如何在 2 个进程(linux)之间共享 OpenGL 上下文/纹理
问题描述
我正在尝试构建 2 个在不同进程中运行的应用程序。一个应用程序将显示来自摄像机(服务器)的实时视频,而另一个应用程序将在该视频之上覆盖 UI(客户端)。该解决方案需要低延迟,因此我想在不通过操作系统合成器的情况下渲染两者。我尝试实现的解决方案涉及创建共享的 OpenGL 上下文或纹理,以便 UI 可以将其部分渲染到某些屏幕外缓冲区/纹理。在渲染每个实时图像帧之后,服务器可以从屏幕外缓冲区/纹理中获取信息并将其渲染在顶部。这样就不会因为进程的同步而增加延迟。如果准备好,服务器将从 UI 获取最新的图像。如果它没有准备好,它不应该等待它,而是使用以前的图像。
如何在进程之间传递纹理或上下文?CreateContext 函数可以获取另一个上下文的指针并使其共享,但据我所知,该地址在进程空间之外将无效。
解决方案
如今,在进程之间共享 GPU 资源的“最干净”的方法是使用 Vulkan 创建这些资源,将它们导出到文件描述符 (POSIX) 或 HANDLE (Win32) 中,然后将它们导入到任一端创建的 OpenGL 上下文中。您可以通过常用方法传递的文件描述符(sendmsg
使用 SCM_RIGHTS、或pidfd_getfd
、或open("/proc/${PID}/fd/${FD}")
.
从 Vulkan 导出:
导入 OpenGL:
https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_external_objects.txt
https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_external_objects_fd.txt
https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_external_objects_win32.txt
只使用“纯”OpenGL 需要很多技巧。一种方法是强制间接上下文(以现代功能为代价,由于缺乏对这些的 GLX 支持)并为此共享 X11 ID。另一种方法是使用 ptrace 访问其他进程中的映射缓冲区。与设置 Vulkan 实例、在其中创建所有纹理然后将它们导入 OpenGL 相比,要正确实现 (BT;DT.),两者都相当令人生畏,而且需要做更多的工作。
推荐阅读
- xsl-fo - 如何防止 fo:page-number-citation 换行
- node.js - 在“...+eATxtf+G1Wn3\nTYqat”附近解析时 json 意外结束
- r - 从R中的黑白图像建模3d散点图
- tensorflow - 为什么这些梯度累积实现不起作用?
- linux - 在 sudo 命令中传递变量
- r - 使用几何将弹出窗口添加到地图
- python - cosmos gremlins json 数据摄取
- javascript - Javascript:Linq.js:返回数组
- postgresql - 在 Heroku 上使用 PostgreSQL 休眠创建表时出错
- go - 如何在mac中修复本地包中的GOROOT问题