通过共享内存访问 X11 窗口像素数据

问题描述 投票:0回答:1

我正在编写一个程序,其中我需要尽可能有效地访问 X11 窗口的像素数据,最好是通过共享内存,而不需要每次我想要刷新像素数据时都进行 XCB 调用。这与

Xvfb
-shmem
选项类似,但我想通过共享内存访问每个窗口的像素数据,而不是整个屏幕。

我可以用任何有帮助的方式配置 X 服务器。 X 服务器无头运行,未连接到真正的视频硬件。

我知道 XShm 和 XComposite 扩展。据我所知,他们每个人只做了我需要的一半:

  • XComposite 扩展将窗口像素数据移动到保存像素数据的屏幕外缓冲区。
  • XShm 扩展允许创建可以从现有窗口更新的共享内存区域和像素图(但据我所知,仅按需更新,并且需要内存复制)。

我可以以某种方式组合这两个扩展,以便我可以直接从我自己的应用程序访问窗口像素数据,而不需要不断要求 X 服务器复制像素数据吗?

linux x11 shared-memory xorg xcb
1个回答
0
投票
根据评论,这实际上是不可能的,因为 X 服务器的内存模型假设 X11 窗口像素数据存在于视频硬件内存中,因此常规进程的“共享内存”概念在这种情况下不一定有意义。然而,在我的上下文中,X 服务器并未在真正的视频硬件上运行。

我为我的用例找到的最佳解决方案是使用指定了

Xvfb

 标志的多头 
-fbdir
 实例,并确保每个窗口都位于其自己的屏幕上,其大小适合窗口的大小。然后,每个屏幕一一映射到一个窗口,并且每个屏幕在
-fbdir
指向的目录下都有一个内存可映射文件。

© www.soinside.com 2019 - 2024. All rights reserved.