-->

异步glReadPixels与PBO(Asynchronous glReadPixels with

2019-06-26 04:03发布

我想用两个公益组织来读取另一种方式像素。 我认为PBO方式会更快,因为glReadPixels使用PBO时,和很多的时间可以重叠立即返回。

奇怪的是,似乎没有太大的好处。 考虑到像一些代码:

    glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
    Timer t; t.start();
    glReadPixels(0,0,1024,1024,GL_RGBA, GL_UNSIGNED_BYTE, buf);
    t.stop(); std::cout << t.getElapsedTimeInMilliSec() << " ";

    glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pbo);
    t.start();
    glReadPixels(0,0,1024,1024,GL_RGBA, GL_UNSIGNED_BYTE, 0);
    t.stop(); std::cout << t.getElapsedTimeInMilliSec() << std::endl;

其结果是

1.301 1.185
1.294 1.19
1.28 1.191
1.341 1.254
1.327 1.201
1.304 1.19
1.352 1.235

PBO的方法是快一点,但不是一个令人满意的即时回报

我的问题是:

  • 什么是影响glReadPixels'性能因素是什么? Somethimes,它的成本在这里达到10毫秒,而1.3ms。
  • 为什么要立即退回费用高达1.2ms的? 是不是过大或只是正常的?

================================================== =========================

根据与演示相比较,我发现了两个因素:

  • GL_BGRA比GL_RGBA,1.3ms => 1.0ms的(无PBO),1.2ms的=> 0.9ms更好(与PBO)
  • glutInitDisplayMode(GLUT_RGB | GLUT_ALPHA),而不是GLUT_RGBA,0.9ms => 0.01ms.That就是我想要的性能。 在我的系统,GLUT_RGBA = GLUT_RGB = 0。 GLUT_ALPHA = 8

接着又两个问题:

  • 为什么GL_BGRA比GL_RGBA更好? 难道只是特定平台或所有平台的情况下?
  • 为什么GLUT_ALPHA是如此的重要,它影响PBO性能巨大?

Answer 1:

我不知道glutInitDisplayMode的心脏,但是这通常是因为你的内部和外部的格式不匹配。 例如,你不会注意到异步行为时,组件的数量不匹配,因为这种转换仍然阻止glReadPixels

因此,最有可能的问题是,与glutInitDisplay(GLUT_RGBA)你会真正创建一个内部格式,实际上是一个默认的帧缓冲RGB甚至BGR 。 经过GLUT_ALPHA参数很可能会使其RGBABGRA内部,要组件的数量相匹配。

编辑:我发现了一个NVIDIA文件解释有关像素打包和性能影响的一些问题。

EDIT2:的性能增益BGRA可能是因为内部硬件缓冲区是BGRA ,有没有真的很多吧。



Answer 2:

BGRA是最快的,因为这是对现代GPU的原始格式。 RGBA,RGB和BGR需要时回读“格式化”。



文章来源: Asynchronous glReadPixels with PBO