Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

11

06.09.2014, 15:35

Soll das heißen, jedes deiner Tiles hat ein eigenes Bitmap?
Dann ist ja klar, dass du massig Speicher verbrauchst. Verschwendung pur.
sizeof(Klasse) sagt übrigens wenig über den tatsächlichen Speicherverbrauch aus, denn der Konstruktor kann ja mehr Speicher vom Heap anfordern.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

12

06.09.2014, 15:36

Warum sollte ein Leveleditor alles einzeln auf dem Heap anlegen müssen?
Nebenbei, bist du vielleicht zufällig noch im Debug-Modus?

Ich kenne mich mit Qt zu wenig aus für eine weiterführende hilfreiche Antwort, aber für mich sieht das stark so aus, als ob diese Basisklasse dann schuld ist. Vermutlich erledigt sie weitere Allokationen und frisst Speicher. Ich vermute außerdem hier stark, dass schon Vererbung hier fehl am Platz ist und Qt eine effizientere Lösung ermöglicht. Aber mehr dazu weiß ich leider nicht.

13

06.09.2014, 16:23

Zitat


Soll das heißen, jedes deiner Tiles hat ein eigenes Bitmap?
Dann ist ja klar, dass du massig Speicher verbrauchst. Verschwendung pur.


Das stimmt natürlich hab garnicht drüber nachgedacht :dash:

Zitat

Nebenbei, bist du vielleicht zufällig noch im Debug-Modus?

Nein.

14

06.09.2014, 16:39

Wenn es ruckelt kann es auch an ganz anderen Dingen liegen. Zum Beispiel gibt es sowas wie Cache-Kohärenz, was stark vereinfacht bedeutet, dass es schneller ist, Daten zu verarbeiten, die dicht hintereinander liegen, als welche die über den ganzen Hauptspeicher verstreut sind. Erzeugst du also 10.000 Tiles mit new, musst du die an 10.000 zufälligen Stellen im Speicher suchen. Erstellst du einen Vektor mit 10.000 Tile-Objekten liegt alles schön beieinander und du kannst sie in einem Rutsch abarbeiten. Der Effekt ist derartig stark, dass es z.B. in der Regel schneller ist, ein Element in einem Vektor zu suchen und zu löschen, als in einer Liste (obwohl man beim Löschen aus dem Vektor alle Elemente kopieren muss, bei listen aber nur 2 Zeiger ändern muss - aber da alle Elemente verteilt sind, dauert das Suchen einfach ewig.)

Und anstatt von QGraphicsPixmapItem zu erben, solltest du lieber folgendes tun: Du erstellst ein QGraphicsPixmapItem für jede Grafik die vor kommt genau einmal und speicherst dann im Tile nur einen Zeiger darauf. Im Normalfall werden ja Grafiken bei Tiles sehr häufig wiederverwendet, es könnte also durchaus sein, dass du nur 1/1000 vom Speicher brauchst, wenn du sie einfach referenzierst.
Lieber dumm fragen, als dumm bleiben!

15

06.09.2014, 16:52

Werd ich umsetzen danke :) Ich glaube aber das dass mit dem Speicher doch an QT liegt weil in der Schleife ja nur ein neues Objekt erzeugt wird sonst nichts. Werde dann mal schauen ob es vielleicht was bessers als QGraphicsPixmapItem gibt.

16

06.09.2014, 18:42

Äh, ein QGraphicsPixmapItem ist doch dafür da, es in einer QGraphicsScene hin und her zu bewegen, auszuwählen etc. Sind deine Tiles beweglich? Wenn nicht, ist das die falsche Lösung.
Falls du Objekte hast, die du vor den Tiles hin- und herbewegen können willst, dann wäre das die richtige Klasse.

Die Tiles würde ich, wenn es eben normale Tiles sind, über den Hintergrund der QGraphicsScene zeichnen (QGraphicsScene::drawBackground(...) ) und intern eine 2D Struktur verwenden, wo nur eine Nummer gespeichert ist. Die Nummer dient als Index in ein internes Tileset, wo dann die Grafiken liegen. Oder so ähnlich.

Zitat


Du erstellst ein QGraphicsPixmapItem für jede Grafik die vor kommt genau einmal und speicherst dann im Tile nur einen Zeiger darauf

Das ist also nicht der richtige Ansatz. Ein QGraphicsPixmapItem ist, wie gesagt, dafür da, es in einer QGraphicsScene herumschieben zu können etc. Das geht weit über das Speichern von Grafiken hinaus. Die Grafiken werden über bloße QPixmaps gespeichert.

Übrigens:

Zitat

QPixmap objects can be passed around by value since the QPixmap class uses implicit data sharing.

Das sollte also nicht das Problem sein. Aber die QGraphicsItems haben schon recht viele Features...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »DerKlaus« (06.09.2014, 18:48)


Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

17

06.09.2014, 18:58

So viele Spekulationen hätten durch Offenlegung der Klassen-Definition beseitigt werden können. D;
Aber bei 8 Bytes würde ich Tiles dann doch eher in einem std::vector statisch erzeugen.

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

18

06.09.2014, 20:18

Es gibt noch einen zweiten Grund, warum hier wesentlich mehr Speicher verbraucht wird, als erwartet: irgendwo muessen intern diese 1 Million Allokationen auch verwaltet werden. Je nachdem welche Runtime etc. wird dann bei einer Allokation nicht nur 8 Byte (wenn das wirklich so waere...) sondern doch eher sowas in der Richtung 40-100 Byte benoetigt. Solche kleine Klassen/ Strukturen sollte man daher nicht einzeln anlegen, sondern immer blockweise.

19

07.09.2014, 20:06

DerKlaus sagt es schon ganz richtig.
Es ist der falsche Weg, jedes Tile zu einem QGraphicsItem zu machen. Über den Background zu zeichnen reicht hier vollkommen!
Möchte man Tiles über den Objekten zeichnen, muss man eben im Foreground zeichnen.

Werbeanzeige