Ho progettato un programma che, in pratica, taglia una forma geometrica in molti piccoli triangoli (in una "tela sinistra"), applica una semplice trasformazione matematica al mazzo di triangoli e li ridisegna in la loro nuova configurazione. Guarda la schermata qui sotto.Qt/C++: disegno efficiente
Al fine di richiamare questi triangoli, io uso QPainter::drawPolygon
. Ogni triangolo a destra corrisponde a un triangolo a sinistra, quindi so quale colore voglio usare per disegnarlo.
Finora, bene. Anche se disegno molti più triangoli di questo (quando uso triangoli molto più piccoli per tagliare la forma), questo è abbastanza veloce.
Ho aggiunto una funzione al mio programma: posso disegnare triangoli estratti da un'immagine invece di triangoli semplici: vedere la seguente schermata di cattura.
Il problema è che il mio modo di fare questo è troppo lento. Ecco come lo faccio:
- corro attraverso tutti i triangoli
- Per ogni triangolo, io calcolare le coordinate di ogni pixel che verrà visualizzato.
- Per ognuno di questi pixel, computo le coordinate del pixel corrispondente sull'immagine (questa è un'operazione matematica semplice) e recupero il colore di quel pixel.
- Io uso
QPainter::setPen(QColor)
eQPainter::drawPoint(QPoint)
per disegnare il pixel.
Sono nuovo alla programmazione in Qt e non so nulla di grafica, quindi questo è quello che potrei inventare. Il problema è che è "inaccettabilmente" troppo lento (lo paintEvent
di ogni tela richiede circa 0,15 s, rispetto a 0,01 nel caso di triangoli semplici).
ho eseguito un profiler per cercare di capire cosa sta succedendo, ho notato che in viene speso del paintEvent
,
- 58% del tempo è trascorso in
QPainter::drawPoint
- il 27% del tempo widget di tela in
QPainter::setPen
sembra che QPainter::drawPoint
è troppo complicato e lento: voglio solo per stampare un pixel di un determinato colore, il gioco è fatto.
Probabilmente ho trovato una soluzione al mio problema: archiviare un QImage
(come variabile membro del mio widget tela) che rappresenta l'intera cosa che desidero visualizzare sul mio canvas e definirlo interamente nel mio paintEvent
pixel per pixel, e quindi disegnarlo immediatamente alla fine del mio paintEvent
con QPainter::drawImage
. Ho un suggerimento che questo sarà molto più veloce. Ma prima di riscrivere il mio codice ancora una volta, mi piacerebbe sapere se è davvero quello che voglio fare.
Spero di non averti annoiato a morte! Molte grazie in anticipo per i tuoi approfondimenti.
stai disegnando pixel per pixel ?? (zomg !!) – UmNyobe