Hi,
ich habe eine Klasse, die QGraphicsScene erbt und eine große Menge von 2D Objekten darstellt. Die Objekte sind Custom QGraphicsLineItems, die je nach LevelOfDetail angezeigt werden oder nicht. Es sind so viele, dass die gesamte Szene zu viel Speicher benötigt (>>500K Items). Um das zu beheben fallen mir zwei Dinge ein:
1. Da viele der Linien bis auf ihre Position exakt gleich sind, ist es vielleicht möglich dafür nur ein Objekt zu erstellen und es an mehreren Stellen zu zeichnen?! Gibt es dafür eine Möglichkeit in Qt?
2. Ich halte nur die Objekte im Speicher, die gerade auch angezeigt werden. Dazu müsste ich bei jedem Update der Szene entsprechend Objekte löschen und neu erstellen was natürlich Zeit kostet... Welche Funktion von QGraphicsScene sollte ich dazu am Besten überladen? addItem() löst ja selbst auch wieder ein Update der Szene aus, kann ich diesen Kreislauf irgendwie vermeiden?
Beide Lösungen erscheinen mir nicht wirklich schön, weitere Ideen sind also mehr als willkommen.
Hintergrund: Bei dem Widget handelt es sich um eine Timeline mit vielen vertikalen Linien an den Positionen für Stunden, Minuten, Sekunden und Frames. Die Linien für Frames werden entsprechend nur eingeblendet, wenn man weit reingezoomt hat usw. Das Widget muss hohe FPS unterstützen und gleichzeitig sehr lange Videos (>24h), daher die große Zahl an LineItems. Ich hoffe mal, dass der Ansatz QGraphicsScene/LoDLineItems nicht der falsche Weg für sowas ist?!
QGraphicsScene mit vielen Items braucht zuviel Speicher
Re: QGraphicsScene mit vielen Items braucht zuviel Speicher
Für die Zeitlinien (h, m, s) würde ich keine Items machen. Warum nicht ein "Background-Item", das über respektive unter die ganze Scene gelegt wird? In seiner Paint-Methode abhängig vom LOD und zu paintendem Bereich die Linien "von Hand" zeichnen.
ODT Informatik GmbH, Reto Tschofenig
Re: QGraphicsScene mit vielen Items braucht zuviel Speicher
Ein Background Item hätte den Nachteil, dass bei jedem Update alle Linien neu gezeichnet werden und nicht nur die, die tasächlich in Views sichtbar sind, oder?!
Ich habe jetzt umgestellt und habe keine QGraphicsScene mehr aber dafür einen Custom QGraphicsView bei dem ich die Linien in drawBackground zeichne. Geht schneller und spart Speicher.
Danke für den Tip.
Ich habe jetzt umgestellt und habe keine QGraphicsScene mehr aber dafür einen Custom QGraphicsView bei dem ich die Linien in drawBackground zeichne. Geht schneller und spart Speicher.
Danke für den Tip.