Асинхронный readback от opengl переднего буфера с помощью нескольких PBO's

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

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

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

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

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

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

Я надеюсь, что мой вопрос достаточно ясен, я знаю, что ответ, вероятно, также будет где-нибудь в Интернете, но я главным образом придумал результаты, которые использовали PBO's, чтобы сохранить буферы в видеопамяти и сделать обработку там. Я действительно должен считать назад передний буфер в RAM, и я не нахожу четких объяснений о производительности в этом случае (в котором я нуждаюсь, я не могу полагаться, "это быстрее", должен объяснить я, почему это быстрее).

Спасибо

5
задан KillianDS 18 April 2010 в 10:41
поделиться

1 ответ

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

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

  • рисуют N
  • запускают чтение PBO из N из заднего буфера
  • рисуют N + 1
  • запускают чтение PBO N + 1
  • синхронизируют чтение PBO N
  • обрабатывать N
  • ...

из одного потока.

3
ответ дан 15 December 2019 в 06:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: