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

1

06.09.2014, 14:27

Klasse frisst zu viel Arbeitsspeicher

Hey,

ich habe gerade ein kleines Problem mit einer Klasse die zu viel Arbeitsspeicher frisst. Die Klasse ist laut sizeof 8 byte groß und ich erzeuge in einer Schleife mehrere Objekte der Klasse:

C-/C++-Quelltext

1
2
3
4
5
for(unsigned i = 0; i < mapSizeX*mapSizeY; i++)
    {
        Tile *tile= new Tile();
        tile->setPos(x,y);
    }


Wenn mapSizeX und mapSizeY beide 1000 sind wird die Schleife ja 1.000.000 mal durchlaufen. Das heißt 8byte * 1.000.000 = 8.000.000 byte und wenn man das dann zweimal durch 1024 teilt kommt man ja auf 7,6 mb. Laut Taskmanager verbraucht mein Programm danach aber nicht 7,6mb mehr sondern 350 8|

Hab schon gegooglet und alles probiert komme aber irgendwie nicht weiter :/

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

06.09.2014, 14:32

Was machst du denn sonst noch alles in deinem Programm?
Welche Libraries hast du geladen?
Hast du Bilder, Sounds etc. geladen?

3

06.09.2014, 14:34

Ich verwende Qt und sonst nichts. Zu dem Zeitpunkt sind noch keine Bilder oder Sounds geladen.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

06.09.2014, 14:40

Dann ist es wohl Qt schuld. Das ist bekanntlich eine gigantische Library.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

5

06.09.2014, 14:41

Mach Dir darüber (erstmal) keine Platte. Die Runtime macht viel im Hintergrund vorausgreifend, zum Beispiel holt sie ab Start ein paar große Blöcke Speicher vom Betriebssystem, um sie Dir dann bei new portionsweise zur Verfügung zu stellen. Außerdem haben alle Libs, die Du so verwendest, zusätzliche Startdaten und Initialisierungsbedarf.

Außerdem: Deine Klasse mag nur 8 Byte groß sein, aber jede Allokation hat zusätzlich ein bisschen Verwaltungsoverhead. Und wenn Du den Debug Build startest, ist zusätzlich noch ne Menge an Sicherheitsgrenzen vor und hinter jeder Allokation, die bei so kleinen Allokationen dann einen heftigen Overhead darstellen.

Tiles würde ich auch nicht einzeln mit new erzeugen. Aber das ist ein anderes Thema.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

6

06.09.2014, 14:42

Naja beim Leveleditor Tiled kann man auch Maps generieren die viel größer als 1000x1000 sind ohne viel zu verbrauchen also muss es ja irgendwie bei mir liegen :/

7

06.09.2014, 14:44

Zitat

Mach Dir darüber (erstmal) keine Platte


Naja das kann man jetzt so nicht sagen, da es mit mehreren Layern ziemlich krass ruckelt.

FSA

Community-Fossil

  • Private Nachricht senden

8

06.09.2014, 14:44

Das hat aber nichts mit dem RAM verbrauch zutun...

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

9

06.09.2014, 15:15

Wird dieser Code also vielleicht (versehentlich) mehrmals aufgerufen? Wie sieht der Verbrauch aus, wenn dieser Code auskommentiert ist?

Wie sieht den der Konstruktor von "Tile" aus? Allokiert er weiteren Speicher? Bist du vielleicht noch im Debug Mode?
Außerdem halte ich es für eine sehr schlechte Idee jedes einzelne kleine Tile getrennt auf dem Heap anzulegen.
Im Moment hast du vermutlich auch noch ein Speicherleck. Außerdem gibt es drastischen Verwaltungs-Overhead, bei dem der Speicherverbrauch zusätzlich erhöht wird und die Anwendung besonders bei der Allokation aber auch später durch Cacheeffekte verlangsamt ist.

Zitat von »Schrompf«

Mach Dir darüber (erstmal) keine Platte. Die Runtime macht viel im Hintergrund vorausgreifend, zum Beispiel holt sie ab Start ein paar große Blöcke Speicher vom Betriebssystem, um sie Dir dann bei new portionsweise zur Verfügung zu stellen.

Das stimmt zwar, es sollte aber nicht eine so drastischen zusätzlichen Speicherverbrauch führen. Außerdem sollten diese Blöcke erst bei der Benutzung physikalischen Speicher zugewiesen bekommen und im Task Manager sowieso nicht dazu zählen.

Ich glaube auch nicht daran, das Qt alleine daran schuld ist. Da wirst du schon etwas falsch gemacht haben.
Es ist eine große Lib, aber die allokiert und benutzt sicher nicht vom bloßen Einbinden 340MB Speicher.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (06.09.2014, 15:29)


10

06.09.2014, 15:28

Zitat


Wird dieser Code also vielleicht (versehentlich) mehrmals aufgerufen? Wie sieht der Verbrauch aus, wenn dieser Code auskommentiert ist?
versehentlich wird er nicht aufgerufen das hab ich schon kontrolliert. Wenn ich den Teil auskommentiere dann verbraucht das Programm ca 20mb. Es passiert also erst wenn ich die Map erstelle.

Zitat

Wie sieht den der Konstruktor von "Tile" aus? Allokiert er weiteren Speicher?

Also der Konstruktor von Tile allokiert nichts, jedoch erbt tile von QGraphicsPixmapItemund was der Konstruktor davon macht weiß ich leider nicht :D

Achja wäre vielleicht noch zu erwähnen das das ein Leveleditor ist an dem ich gerade arbeite weshalb es nicht anders geht als jedes einzelne Tile auf dem Heap anzulegen

Werbeanzeige