2010-04-18 10 views
5

Estoy desarrollando una aplicación que necesita volver a leer el cuadro completo desde el buffer frontal de una aplicación openGL. Puedo secuestrar la biblioteca opengl de la aplicación e insertar mi código en swapbuffers. Por el momento estoy usando con éxito un comando glReadPixels lento pero insoportable sin PBO.Relectura asincrónica desde el buffer frontal OpenGL usando múltiples PBO

Ahora leo sobre el uso de múltiples PBO para acelerar las cosas. Si bien creo que he encontrado suficientes recursos para programar eso (no es tan difícil), me quedan algunas preguntas operativas. Me gustaría hacer algo como esto:

  1. crear una serie (por ejemplo, 3) de
  2. glReadPixels uso de PBO en mis swapBuffers anular para leer datos de memoria intermedia frente a una PBO (debe ser rápido y sin bloqueo, a la derecha ?)
  3. Cree un hilo separado para llamar a glMapBufferARB, una vez por PBO después de glReadPixels, porque esto se bloqueará hasta que los píxeles estén en la memoria del cliente.
  4. procesar los datos procedentes de la etapa 3.

Ahora mi principal preocupación es, por supuesto, en los pasos 2 y 3. He leído sobre glReadPixels utilizados en ser no-bloqueo de PBO, ¿será un problema si expido nueva opengl comandos después de eso muy rápido? ¿Se bloquearán esos comandos opengl? ¿O continuarán (mi suposición), y si es así, supongo que solo swapbuffers pueden ser un problema, este se bloqueará o se glReadPixels desde el buffer frontal será mucho más rápido que el intercambio (aproximadamente cada 15-> 30ms) o, en el peor de los casos escenario, ¿swapbuffers se ejecutará mientras glReadPixels aún está leyendo datos en el PBO? Mi conjetura actual es que esta lógica hará algo como esto: copiar FRONT_BUFFER -> lugar genérico en VRAM, copiar VRAM-> RAM. Pero no tengo idea de cuál de esos 2 es el verdadero cuello de botella y más, cuál es la influencia en la secuencia de comandos opengl normal.

Luego, en el paso 3. ¿Es aconsejable hacerlo de forma asíncrona en un hilo separado de la lógica de apertura normal? Por el momento, creo que no, parece que tienes que restaurar las operaciones del búfer a la normalidad después de hacer esto y no puedo instalar objetos de sincronización en el código original para bloquearlos temporalmente. Así que creo que mi mejor opción es definir un cierto retraso swapbuffer antes de leerlos, por lo que p. llamando a glReadPixels en PBO i% 3 y glMapBufferARB en PBO (i + 2)% 3 en la misma secuencia, lo que da como resultado un retraso de 2 fotogramas. Además, cuando llamo a glMapBufferARB para usar datos en la memoria del cliente, ¿será este el cuello de botella o glReadPixels (asincrónicamente) será el cuello de botella?

Y, por último, si tiene algunas mejores ideas para acelerar la lectura de fotogramas de la GPU en OpenGL, dígame, porque este es un cuello de botella doloroso en mi sistema actual.

Espero que mi pregunta sea lo suficientemente clara, sé que la respuesta probablemente también esté en algún lugar de Internet, pero en su mayoría obtuve resultados que usaban PBO para mantener los buffers en la memoria de video y procesarlos allí. Realmente necesito volver a leer el buffer frontal en la RAM y no encuentro explicaciones claras sobre el rendimiento en ese caso (que necesito, no puedo confiar en que "es más rápido", necesito explicar por qué es más rápido).

Gracias

Respuesta

3

¿Seguro que desea leer de la memoria intermedia de entrada? No posee este búfer, y dependiendo de su sistema operativo podría ser destruido, por ejemplo, por otra ventana en la parte superior.

Por su caso de uso, la gente suele hacer

  • sorteo N
  • empezar PBO leer N de búfer posterior
  • sorteo N + 1
  • empezar PBO leer N + 1
  • sincronización PBO leído N
  • proceso N
  • ...

desde un único hilo.

+0

Sé que quiero leer desde el buffer frontal (o desde el buffer posterior justo antes de la llamada), este no es realmente el problema. Tu respuesta me ayuda con mi pregunta sobre enhebrar, que de hecho ya sospeché. Pero realmente me gustaría saber qué sucede detrás de las pantallas en la GPU cuando haces esto, qué se bloquea, qué no, es razonable intentar usar más de dos PBO, .... Gracias por la respuesta ya de todos modos :)! – KillianDS

+0

Usar el buffer de respaldo es la mejor opción. Lo que pasa detrás de las escenas es conductor dependiente. Normalmente, la lectura asíncrona se publica en la fifo de la GPU, donde se procesará cuando le llegue el turno de la GPU. Al finalizar, la GPU enviará un token que le informará al conductor que la operación ha finalizado, lo que desbloqueará los MapBuffers. Para algo más específico, tendrás que hablar con un ingeniero nVidia/AMD. Podría tener sentido usar más de dos almacenamientos intermedios, dependiendo de la cantidad de cuadros que desee tener "en vuelo". Simplemente impleméntalo configurable, y compáralo con puntos de referencia. – eile

Cuestiones relacionadas