QGraphicsScene mit vielen Items braucht zuviel Speicher
Verfasst: 22. Januar 2013 17:53
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?!
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?!