Как быстро записывать данные в QOpenGlBuffer
void initialize(...)
{
...
frame_pbo = new QOpenGLBuffer(QOpenGLBuffer::PixelUnpackBuffer);
frame_pbo->create();
frame_pbo->bind();
frame_pbo->setUsagePattern(QOpenGLBuffer::StaticDraw);
frame_pbo->release();
...
}
вот тут я получаю кадр, записываю в pbo
const quint8* data = frame->getData(stream_num);
frame_width = frame->getWidth(stream_num);
frame_height = frame->getHeight(stream_num);
frame_pbo->bind();
if (const QSize fsize{ frame_width, frame_height }; _frame_size != fsize)
{
_frame_size = fsize;
frame_pbo->allocate(_frame_size.width() * _frame_size.height() * 3);
}
current_ticks = clock();
frame_pbo->write(0, data, frame_width * frame_height * 3);
delta_ticks1 = clock() - current_ticks;
....
проблема заключается в том, что write работает слишком медленно, чтобы отображать данные в среднем значение ~40мс на кадр с разрешением 7680×4320 ( по три пикселя на цвет) как можно это ускорить?
довелось ускорить, заменив write
current_ticks = clock();
auto ptr = frame_pbo->mapRange(0, _frame_size.width() * _frame_size.height() * 3, QOpenGLBuffer::RangeInvalidateBuffer | QOpenGLBuffer::RangeWrite);
memcpy(ptr, data, _frame_size.width() * _frame_size.height() * 3);
frame_pbo->unmap();
std::cout << "map \t" << clock() - current_ticks << std::endl;
просто это дало прирост: На 1098 кадров write занимал 47,065 ms, переделав на maprange -> тот же видеофайл с теми же кажрами, уже 26,597 ms
gl для отображения:
frame_pbo->unmap();
QOpenGLFunctions* f = QOpenGLContext::currentContext()->functions();
f->glEnable(GL_TEXTURE_2D);
f->glEnable(GL_TEXTURE_2D);
f->glBindTexture(GL_TEXTURE_2D, texture_id);
f->glPixelStorei(GL_UNPACK_ROW_LENGTH, frame_width);
f->glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
f->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, frame_width, frame_height, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
f->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
f->glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
glDisable(GL_TEXTURE_2D);
frame_pbo->release();