Асинхронное чтение из переднего буфера opengl с использованием нескольких PBO - PullRequest
5 голосов
/ 18 апреля 2010

Я занимаюсь разработкой приложения, которое должно считывать весь кадр из переднего буфера приложения openGL. Я могу взломать библиотеку opengl приложения и вставить свой код в swapbuffers. На данный момент я успешно использую простую, но мучительную медленную команду glReadPixels без PBO.

Теперь я читаю об использовании нескольких PBO для ускорения процесса. Хотя я думаю, что нашел достаточно ресурсов для программирования (не так уж сложно), у меня остались некоторые рабочие вопросы. Я бы сделал что-то вроде этого:

  1. создать серию (например, 3) из PBO
  2. используйте glReadPixels в моем переопределении swapBuffers для чтения данных из переднего буфера в PBO (должно быть быстрым и неблокирующим, верно?)
  3. Создайте отдельный поток для вызова glMapBufferARB, один раз на PBO после glReadPixels, потому что это будет блокировать до тех пор, пока пиксели не окажутся в памяти клиента.
  4. Обработка данных с шага 3.

Теперь моя главная проблема, конечно же, в шагах 2 и 3. Я читал о glReadPixels, используемых для неблокирования PBO. Будет ли это проблемой, если после этого я выполню новые команды opengl очень быстро? Будут ли эти команды opengl блокироваться? Или же они будут продолжаться (мое предположение), и если да, то, я думаю, могут возникнуть проблемы только со свопбуферами, будет ли эта остановка или glReadPixels из переднего буфера будет во много раз быстрее свопинга (примерно каждые 15-> 30 мс) или, в худшем случае сценарий, будут ли выполняться подкачки, пока glReadPixels все еще считывает данные в PBO? Мое текущее предположение состоит в том, что эта логика будет делать что-то вроде этого: скопировать FRONT_BUFFER -> общее место в VRAM, скопировать VRAM-> RAM. Но я понятия не имею, какое из этих 2 является реальным узким местом и, более того, каково влияние на обычный поток команд opengl.

Тогда на шаге 3. Разумно ли делать это асинхронно в потоке, отделенном от обычной логики opengl? На данный момент я думаю, что нет. Похоже, что после этого вам нужно восстановить нормальные операции буфера, и я не могу установить объекты синхронизации в исходном коде, чтобы временно их заблокировать. Поэтому я думаю, что мой лучший вариант - определить определенную задержку свопбуффера перед их чтением, например, вызов glReadPixels для PBO i% 3 и glMapBufferARB для PBO (i + 2)% 3 в том же потоке, что приводит к задержке в 2 кадра. Кроме того, когда я вызываю glMapBufferARB для использования данных в памяти клиента, это будет узким местом или узким местом будет glReadPixels (асинхронно)?

И, наконец, если у вас есть идеи по ускорению воспроизведения кадров из GPU в opengl, скажите, пожалуйста, потому что это болезненное узкое место в моей нынешней системе.

Я надеюсь, что мой вопрос достаточно ясен, я знаю, что ответ, вероятно, также будет где-то в Интернете, но я в основном пришел к результатам, которые использовали PBO для хранения буферов в видеопамяти и обработки там. Мне действительно нужно прочитать передний буфер в ОЗУ, и я не нахожу никаких четких объяснений производительности в этом случае (что мне нужно, я не могу полагаться на «это быстрее», мне нужно объяснить, почему это быстрее).

Спасибо

1 Ответ

3 голосов
/ 19 апреля 2010

Вы уверены, что хотите прочитать из переднего буфера? У вас нет этого буфера, и в зависимости от вашей ОС он может быть разрушен, например, другим окном поверх него.

В вашем случае люди обычно делают

  • ничья N
  • начать чтение PBO N из заднего буфера
  • ничья N + 1
  • начало чтения ПБО N + 1
  • синхронизация чтения ПБО N
  • процесс N
  • ...

из одной нити.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...