2012-07-10 35 views
8

Quiero utilizar dos PBO para leer píxeles de forma alternativa. Pensé que el modo PBO será mucho más rápido, porque glReadPixels regresa inmediatamente cuando se usa PBO, y se puede superponer un montón de tiempo.glReadPixels asíncronas con PBO

Extrañamente parece que no hay mucho beneficio. Teniendo en cuenta un cierto código como:

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; 

El resultado es

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 

La forma PBO es un poco más rápido, pero no una satisfactoria inmediata de retención

Mi pregunta es:.

  • ¿Cuál es el factor que afecta el rendimiento de glReadPixels? A veces, el costo alcanza 10 ms, pero 1,3 ms aquí.
  • ¿Por qué de devolución inmediata cuesta tanto como 1.2ms? ¿Es demasiado grande o simplemente normal?

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

de acuerdo con la comparación con una demo, me encontré con dos factores:

  • GL_BGRA es mejor que GL_RGBA, 1.3ms => 1,0 ms (sin PBO), 1.2ms => 0,9 ms (con PBO)
  • glutInitDisplayMode (GLUT_RGB | GLUT_ALPHA) en lugar de GLUT_RGBA, 0,9 ms => 0.01ms . Esa es la actuación que quiero. En mi sistema, GLUT_RGBA = GLUT_RGB = 0. GLUT_ALPHA = 8

luego otros dos preguntas:

  • ¿Por qué es mejor que GL_BGRA GL_RGBA? ¿Es el caso solo para una plataforma específica o para todas las plataformas?
  • ¿Por qué GLUT_ALPHA es tan importante que afecta enormemente el rendimiento de PBO?
+0

ooo simplemente probado esto mismo en mi sistema GLUT_RGBA 330 fps GLUT_RGB | 630fps GLUT_ALPHA Eso es un aumento por un factor 2 que se había perdido GLUT_ALPHA era importante. – ColacX

Respuesta

5

No sé glutInitDisplayMode de memoria, pero esto normalmente se debe a que su formato interno y externo no coinciden. Por ejemplo, no notará el comportamiento asincrónico cuando la cantidad de componentes no coincidan porque esta conversión aún bloquea el glReadPixels.

Así que el problema más probable es que con glutInitDisplay(GLUT_RGBA) realmente creará un framebuffer predeterminado con un formato interno que en realidad es RGB o incluso BGR. pasar el parámetro GLUT_ALPHA es probable que lo haga RGBA o BGRA internamente, que coincide con la cantidad de componentes que desea.

corregir: Encontré nvidia document que explica algunos problemas sobre el embalaje del pixel y la influencia del rendimiento.

edit2: La ganancia de rendimiento de BGRA es probable porque el búfer de hw interno está en BGRA, no hay mucho más que eso.

2

BGRA es el más rápido ya que este es el formato nativo de las GPU modernas. RGBA, RGB y BGR necesitan 'formatearse' durante la lectura.

Cuestiones relacionadas