He diseñado un programa que, básicamente, corta una forma geométrica en muchos triángulos pequeños (en un "lienzo izquierdo"), aplica una transformación matemática simple al grupo de triángulos y los vuelve a dibujar en su nueva configuración. Ver captura de pantalla a continuación.Qt/C++: dibujo eficientemente
Para la elaboración de estos triángulos, utilizo QPainter::drawPolygon
. Cada triángulo a la derecha corresponde a un triángulo a la izquierda, así que sé qué color quiero usar para dibujarlo.
Hasta ahora, bien. Incluso si dibujo muchos más triángulos que este (cuando uso triángulos mucho más pequeños para cortar la forma), esto es lo suficientemente rápido.
He agregado una característica a mi programa: puedo dibujar triángulos extraídos de una imagen en lugar de triángulos simples: ver la siguiente captura de pantalla.
El problema es que mi forma de hacer esto es demasiado lento. Así es como lo hago:
- corro por todos los triángulos
- Para cada triángulo, puedo calcular las coordenadas de cada píxel que se mostrará.
- Para cada uno de estos píxeles, calculo las coordenadas del píxel correspondiente en la imagen (esta es una operación matemática fácil) y recupero el color de ese píxel.
- Yo uso
QPainter::setPen(QColor)
yQPainter::drawPoint(QPoint)
para dibujar el píxel.
Soy nuevo a la programación en Qt y no sé nada de gráficos, así que esto es lo que podría ocurrir. El problema es que es "inaceptablemente" demasiado lento (el paintEvent
de cada lienzo ocupa aproximadamente 0,15 segundos, en comparación con 0,01 en el caso de los triángulos sencillos).
me encontré con un perfilador para tratar de entender lo que está pasando, me di cuenta de que en que se gasta de paintEvent
,
- 58% del tiempo se gasta en
QPainter::drawPoint
- 27% de las veces el widget de lona en
QPainter::setPen
parece que QPainter::drawPoint
es demasiado complicado y lento: sólo quiero que para imprimir un píxel de un color determinado, eso es todo.
Pude haber encontrado una solución a mi problema: almacenar QImage
(como una variable miembro de mi widget canvas) que representa todo lo que quiero que mi lienzo muestre, y definirlo completamente en mi paintEvent
píxel por píxel, y luego dibujarlo de una vez al final de mi paintEvent
con QPainter::drawImage
. Tengo una pista de que esto será mucho más rápido. Pero antes de volver a escribir mi código, me gustaría saber si eso es realmente lo que quiero hacer.
Espero que no te haya aburrido para hacer la muerte! Muchas gracias de antemano por sus ideas.
¿está dibujando píxel por píxel? (zomg !!) – UmNyobe