Доступ к данным пикселей окна X11 через общую память

Я пишу программу, в которой мне нужно максимально эффективно получить доступ к пиксельным данным окна X11, в идеале через общую память, без необходимости выполнять вызовы XCB каждый раз, когда я хочу обновить пиксельные данные. Это аналогичная опция Xvfb-shmem, но я хочу получить доступ к данным пикселей каждого окна через общую память, а не ко всему экрану.

Я могу настроить X-сервер любым способом, который поможет в этом. X-сервер работает без управления и не подключен к реальному видеооборудованию.

Мне известны расширения XShm и XComposite. Насколько я вижу, каждый из них делает только половину того, что мне нужно:

  • Расширение XComposite перемещает данные пикселей окна во внеэкранный буфер, в котором хранятся данные пикселей.
  • Расширение XShm позволяет создавать области общей памяти и растровые изображения, которые можно обновлять из существующих окон (но, насколько я могу судить, только по требованию и требуя копирования памяти).

Могу ли я каким-то образом объединить эти два расширения, чтобы иметь прямой доступ к данным пикселей окна из моего собственного приложения без необходимости постоянно просить X-сервер копировать данные пикселей?

Нет, вы не можете заставить данные пикселей размещаться в вашей собственной памяти. Чтобы показать изображение, вам нужна видеокарта, а карта дисплея имеет собственную память. Только данные в этой памяти могут быть отображены непосредственно. (Некоторые карты могут использовать основную оперативную память в качестве памяти дисплея, но не все).

n. m. could be an AI 23.06.2024 10:06

Возможно, вам нужен XRender? Это настолько быстро, насколько это возможно.

n. m. could be an AI 23.06.2024 10:27

@n.m.couldbeanAI Я понимаю, почему так обстоит дело с «обычными» X-серверами, подключенными к реальному оборудованию, но в моем случае он работает без видеооборудования (отредактированный вопрос, чтобы прояснить это). Спасибо за ссылку на XRender, хотя он выглядит как наиболее близкий ответ на то, что я ищу в случае с реальным оборудованием.

Etienne Perot 24.06.2024 01:05

X11 не имеет специального лечения для этого случая. Было бы кошмаром реализовать это. Память оконного буфера изначально не является непрерывной внутри кадрового буфера. Кроме того, окно может быть частично затемнено и/или закрыто полупрозрачным окном, поэтому вы не сможете самостоятельно обновить буфер. В чем твоя проблема с Х?

n. m. could be an AI 24.06.2024 05:48

Моя цель — создать способ прозрачного запуска ненадежных приложений с графическим интерфейсом на хосте Linux без виртуальной машины. С этой целью я пишу приложение для песочницы, которое запускает X-сервер внутри ядра пользовательского пространства (gVisor), и я хочу отображать содержимое окон, работающих на изолированном X-сервере, как обычные окна на X-сервере хоста. . Итак, я создаю окна на хост-X-сервере, и их пиксельные данные должны точно отражать пиксельные данные, содержащиеся в памяти изолированного X-сервера. Я изучаю, как это сделать с минимальным копированием памяти.

Etienne Perot 24.06.2024 09:05

Я придумал кое-что, используя аргумент Xvfb-fbdir, который заставляет Xvfb хранить данные пикселей для каждого экрана в виде файлов, отображаемых в памяти. Если я помещу каждое окно на отдельный экран и настрою экраны в соответствии с размерами окон, теоретически я смогу получить через это доступ к данным пикселей окна, хотя я еще не проверял, работает ли это за пределами одного экрана. Другой путь может быть чем-то вроде того, что делает Qubes с использованием поддельного видеодрайвера и запуска X-сервера с LD_PRELOAD библиотекой, которая перехватывает вызовы X glibc для совместного использования страниц данных пикселей.

Etienne Perot 24.06.2024 09:30
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно комментариям, это на самом деле невозможно, поскольку модель памяти X-сервера предполагает, что данные пикселей окна X11 находятся в памяти видеоаппаратуры, поэтому концепция «разделяемой памяти» с обычными процессами не обязательно имеет смысл в этом контексте. Однако в моем контексте X-сервер не работает на реальном видеооборудовании.

Лучшее решение, которое я нашел для своего варианта использования, — это использовать многоголовый экземпляр Xvfb с флагом -fbdir, установленным для каталога внутри /dev/shm, а затем гарантировать, что каждое окно находится на своем собственном экране, размер которого соответствует размеру окна. размер. Затем каждый экран сопоставляется с окном один к одному, и каждый из них имеет отображаемый в памяти файл в каталоге, на который указывает -fbdir.

Другие вопросы по теме