2010-02-10 11 views
6

Sto usando Qt/C++ e sto provando a disegnare un QGraphicsScene grande e complesso. Una volta aggiunto un sacco di oggetti, il panning e lo zoom diventano spiacevolmente lenti. (Nessuna sorpresa qui, ovviamente). Ho giocato con il caching delle coordinate del dispositivo (aiuta con il panning fino a un certo punto) e con gli aggiornamenti minimi della vista e così via, ma alla fine ci sono troppi oggetti. Quello che mi piacerebbe fare è disegnare gli oggetti in modo asincrono dal controllo dell'interfaccia utente in qualche modo. In altre parole, proprio come fa Google Maps, voglio fare una panoramica e fare uno zoom e lasciare che il disegno riprenda più velocemente di quanto sia in grado, ma di essere in grado di eseguire una panoramica prima che gli elementi finiscano di disegnare.Come posso implementare lo scorrimento delle tessere simile a Google Maps in Qt?

Un metodo che sto provando è quello di creare due QGraphicsScenes. Uno ha gli oggetti reali ma non è collegato a un QGraphicsView. L'altro QGraphicsScene è connesso a QGraphicsView, ma ha solo QPixmap piastrellati che sono dimensionati per coprire lo schermo. Il piano è di utilizzare cicli di CPU di riserva per aggiornare qualsiasi pixmap di tile che ne ha bisogno. Questo mi sembra che mi darà il controllo necessario sul rendering (quindi non devo bloccare mentre re-rendering l'intera scena visibile). Pensieri? Qualcuno ha implementato questo?

risposta

3

Dai un'occhiata qui: Generating content in threads.

Sembra che questo è simile a quello che si sta tentando di fare. I meccanismi di tile sono metodi molto comuni per caricare grandi quantità di dati. Oltre al collegamento pubblicato, non ho visto un semplice esempio utilizzando QGraphicsView.

40000 Chips mostra anche alcune cose sulla gestione di grandi quantità di dati.

+0

Ho visto "40000 Chips" - la mia comprensione di questo esempio è che fa una bella tecnica di implementazione del "Livello di dettaglio", dove ha solo un elemento nel QGraphicsScene per ogni chip, ma il paint() del il chip richiama ulteriori dettagli se lo zoom è al di sopra di varie soglie. Il link che hai offerto sembra molto pertinente. Lo proverò nei dettagli non appena avrò la possibilità ... Grazie! –

Problemi correlati