我正在使用带纹理的opengl进行视频流传输。 为了提高效率,我尝试了PBO方法。
然而我发现当我使用PBO时
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pboIds[pboturn]);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, cols, rows, GL_RGBA, GL_UNSIGNED_BYTE, 0);
当我不打电话时不使用PBO:
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, cols, rows, GL_RGBA, GL_UNSIGNED_BYTE, mydata);
虽然两者都在绘制图像,但PBO却没有提供任何效率提升...... 这是因为我使用的是集成的英特尔HD4000系列视频设备,而不是任何独立的视频卡(它实际上是表面专业版)?
glTexSubImage2D需要大约10 + ms才能上传1920 * 1080 rgb图像。这是正常的吗?我是在Qt下开发的,有什么方法可以改善性能吗?
更新 我在AMD显卡上测试了相同的程序。消耗的时间不到1毫秒......我能说这是英特尔图形设备的极限吗?
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,测试代码中也没有缓冲区映射。
答案 0 :(得分:2)
如果您只是将PBO用作图像上传的顺序代理,那么您将无法获得任何收益,因为您实际上是受I / O约束并且必须等待数据传输。 PBO背后的想法是,你可以“在后台”进行数据传输和纹理图像规范,而GPU正忙于绘制内容。
因此,要真正受益于PBO上传,您必须使程序异步操作。