2015-04-28 5 views
-1

Я делаю потоковое видео, используя opengl с текстурой. Чтобы повысить эффективность, я попробовал метод PBO.Opengl PBO не улучшает скорость рисования

Однако я обнаружил, что, когда я использовал ОПО

glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pboIds[pboturn]); 
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, cols, rows, GL_RGBA, GL_UNSIGNED_BYTE, 0); 

и когда я не использую ОПО, просто позвонив:

glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, cols, rows, GL_RGBA, GL_UNSIGNED_BYTE, mydata); 

Хотя оба рисуют образ, но ПБО один не предлагает повышения эффективности ... Является ли это тем, что я использую интегрированное видеоустройство серии Intel HD4000, но не отдельную видеокарту (это на самом деле поверхностный профессионал)?

И glTexSubImage2D берет меня около 10 + ms для загрузки изображения 1920 x 1080 rgb. Это нормально? Я развиваюсь под Qt, есть ли какой-либо способ улучшить производительность?

UPDATE: У меня есть тестовая программа на графической карте AMD. И время, затраченное на падение, упало ниже 1 мс ... Могу ли я сказать, что это предел графического устройства Intel?

UPDATE2:

Вот загрузка поколения буфера и данные часть:

glGenBuffers(1, pboIds); 
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pboIds[0]); 
glBufferData(GL_PIXEL_UNPACK_BUFFER, cols*rows*4, data, GL_STREAM_DRAW); 
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); 

Для тестирования, я только отправить данные один раз во время инициализации, так что больше нет загрузки данных к PBO также не отображает буфер в тестовом коде.

+2

Возможно, вы можете добавить еще какой-либо код карты/unmap? – balajeerc

+0

Привет, для моего тестового случая я загружаю только одно изображение через функцию glBufferData и неоднократно показываю это единственное изображение ... Так что это не проблема кода карты/unmap – Nyaruko

+1

@Nyaruko: ну, если вы это сделаете это в цикле без дополнительных мер предосторожности или явного сиротства, это также может быть проблемой кода map/unmap. Из того, что вы показали до сих пор, это то, что неясно, что происходит, и что именно вы измеряете. – derhass

ответ

2

Если вы просто используете PBO в качестве прокси-сервера для загрузки изображений, вы ничего не получите, так как вы по существу связаны с I/O и должны ждать передачи данных. Идея PBOs заключается в том, что вы можете выполнять передачу данных и спецификацию текстурного изображения «в фоновом режиме», в то время как графический процессор занят рисованием материала.

Чтобы на самом деле извлечь выгоду из загрузки PBO-ed, вы должны заставить свою программу работать асинхронно.

+0

Но в соответствии с документацией, когда я использую PBO, тогда во время рисования, когда я сначала glBindBufferARB() и glTexSubImage2D() должен вернуться, и GPU сделает все остальное? – Nyaruko

Смежные вопросы