¿Cómo haría una prueba unitaria o realizaría la prueba automatizada más efectiva en código gráfico para OpenGL?

17

Estoy escribiendo un juego y el motor de gráficos que lo acompaña en la parte superior de OpenGL en C ++. También soy fanático de los buenos procesos de codificación y las pruebas automatizadas. Las pruebas de código de gráficos + parecen bastante inmiscibles, ya que la salida a menudo es solo visual, o muy orientada a lo visual.

Por ejemplo, imagine analizar el flujo de imágenes sin procesar que se procesa en la pantalla byte a byte: necesita datos de prueba para comparar, lo cual es difícil de crear / obtener, y a menudo las imágenes renderizadas no son idénticas en un nivel de byte cuando se ejecuta en diferentes momentos: pequeños cambios en los algoritmos arruinarán por completo este enfoque.

Estoy pensando en crear un conjunto de pruebas unitarias visuales, en el que básicamente pueda renderizar diferentes escenas de prueba, mostrando cosas como mapeo de sombras, animación, etc., etc. Como parte de CI, estas escenas se mostrarán en un video archivo (o posiblemente dejarlo como un ejecutable) con diferentes métricas. Esto aún requeriría una inspección manual del archivo de video, pero al menos sería algo automatizado y estandarizado.

¿Qué piensas? ¿Espero que haya mejores maneras?

Max
fuente
2
Esta es una buena pregunta, me pregunto si obtendría mejores respuestas en gamedev.stackexchange.com, ya que podría haber más personas allí que se hayan ocupado de esto antes.
FrustratedWithFormsDesigner
3
Como usa OpenGL, considere estudiar la forma en que el grupo Khronos realiza pruebas de conformidad para esta API. Los colegas de mi ex proyecto que se ocuparon de esto me dijeron que las pruebas de gráficos de Khronos son lo más perfectas posible
mosquito
@FrustratedWithFormsDesigner Gracias, me olvidé por completo de gamedev.stackexchange ... Busqué a los programadores bastante a fondo, pero no ese. Parece que la mayoría de las respuestas en las pruebas unitarias allí se centran en las cosas generalmente probadas, así que tal vez esto no sea un duplicado. Sin embargo, comprobaré un poco más, gracias :)
Max

Respuestas:

8

La biblioteca de procesamiento de imágenes opencv lo hace guardando la imagen y comparándola con una imagen de referencia; tiene un montón de funciones de prueba y macros de c ++ para manejar la coincidencia aproximada de imágenes, etc.

Martin Beckett
fuente
Intentaré comprobarlo más a fondo, pero esa página no dice nada sobre la coincidencia aproximada de la imagen. ¿Sabes si funcionaría para las pruebas de regresión en el caso de comparar marcos? Entonces podría inspeccionar visualmente la primera vez que se representa una escena, anotarla como referencia, etc. ¿OpenCV tiene funciones listas para esto que podría usar? : p
Max
@max generalmente hay una versión 'dorada' de la función de prueba que genera el marco de referencia y se ejecuta una vez al crear la prueba. En la distribución hay algunas macros de "prueba de comparación de imágenes". No creo que haya nada específico para volver a leer las memorias intermedias de openGL en una imagen, pero eso es bastante fácil
Martin Beckett
4

Su marco de prueba puede representar su imagen de prueba en un búfer, recuperar la imagen renderizada y compararla con una imagen de referencia "dorada" que se haya generado previamente para ese propósito.

Esto no funcionará tan bien en los casos en que no se espera que los resultados de su prueba sean exactamente los mismos. Sin embargo, puede calcular la diferencia al cuadrado de la prueba y las imágenes de referencia, y compararla con un umbral.

También es posible que desee proporcionar datos de rendimiento de registro y verificación, ya que una regresión importante en el rendimiento es otro modo de falla posible.

tormenta
fuente
4

Incluso si no puede comparar las imágenes de salida, al menos podrá probar que sus renderizaciones se completen adecuadamente (sin bloqueos, largas esperas, etc.). Encontrar una manera de verificar las imágenes es mejor, por supuesto, pero incluso sin ella habrás obtenido algo de las pruebas.

Michael Kohne
fuente
2
Exactamente: estaba a punto de responder algo similar ("Incluso si tiene una prueba de unidad que genera ciegamente el archivo de video y hace algunas pruebas triviales (por ejemplo, tiene la longitud correcta, no completamente negra, no completamente blanca), podría ser suficiente para detectar muchos errores de regresión. Especialmente aquellos que simplemente causan que sus funciones arrojen una excepción "), pero no hay necesidad de una segunda respuesta similar, así que lo dejo solo como un comentario aquí.
user281377