Woher weiß ich, ob der Speicher nicht richtig gehandhabt wird?


12

Der Speicherbedarf meines (2D) -Spiels scheint sich jedes Mal zu erhöhen, wenn ich eine Textur lade, z. B. wenn ich mein Spiel starte, verwendet es 30 MB privaten RAM, nachdem ich eine ~ 367 MB-Hintergrunddatei übertragen habe 54 MB privater RAM.

Dasselbe passiert, wenn man die gleiche Strecke zurückgelegt hat, aber immer wieder zwischen zwei Punkten hin und her gegangen ist.

Meine Anzeigen zeigen jedoch, dass das Programm glDeleteTextures ungefähr eine Sekunde nach dem Verlassen des Bildschirms korrekt aufruft. und valgrind findet keine lecks.

Woher weiß ich, ob ich mir darüber Sorgen machen sollte oder ob es nur eine Eigenart des Arbeitsspeichers des Betriebssystems ist?


1
Wie haben Sie die RAM-Auslastung Ihrer Anwendung ermittelt? Verwenden Sie einen Profiler (welcher?) Oder vertrauen Sie einfach dem Task-Manager Ihres Betriebssystems (welcher)?
Philipp

1
Der Task-Manager in kUbuntu, der Profiler in meinem Debugger, teilt mir mit, dass er auf Daten wartet und zeigt dann nie etwas an.
Patrick Jeeves

1
Übrigens: Wenn Sie den Speicherverbrauch unter Linux überprüfen, sollten Sie nicht nur den vom Spielprozess beanspruchten Speicher betrachten. Als ich einmal an einem Multi-Plattform-Spiel gearbeitet habe, haben wir uns gefragt, warum die Windows-Version so viel mehr RAM verbraucht als die Linux-Version, bis wir bemerkten, dass die Linux-Version unserer Grafik-API anscheinend Speicher für alle Texturen im X11-Prozess reservierte.
Philipp

2
Sie sollten nicht erwarten, dass glDeleteTextures tatsächlich Speicher freigibt: gamedev.stackexchange.com/questions/136883/…
Maximus Minimus

Antworten:


21

Virtueller Speicher wird vom Betriebssystem in großen Blöcken zugewiesen. Wenn in diesem großen Block noch ein Byte verwendet wird, kann es nicht an das Betriebssystem zurückgegeben werden.

Die Zuweisungsbibliotheken im Benutzerbereich behalten auch eine bestimmte Menge für die Wiederverwendung bei, um zu vermeiden, dass wiederholt Speicher vom / zum Betriebssystem benötigt und freigegeben wird, was extrem langsam ist.

Wenn Sie beispielsweise eine Textur zuweisen, reserviert der OpenGL-Treiber eine Tabelle mit 32 Textur-Slots. Wenn Sie weiterhin Texturen zuweisen, muss der Treiber eine größere Tabelle mit 1024 Textur-Slots zuweisen. Diese neue Tabelle belegt nun Platz in dem großen RAM-Block Wenn Sie alle Texturen freigeben, verkleinert der Treiber diese Tabelle nicht und ordnet sie nicht neu zu, in der Erwartung, dass Ihr Spiel / Ihre Anwendung später so viele Texturen verwenden muss, dass kein großer Teil des Arbeitsspeichers an das Betriebssystem zurückgegeben werden kann.

Das ist völlig normal und gewollt. Der ungenutzte Arbeitsspeicher wird von Ihrer App eventuell wiederverwendet.


1
Beachten Sie, dass Sie möglicherweise unter einer übermäßigen Speicherfragmentierung leiden, wenn die Nutzung während des Spiels weiter zunimmt, Leckanzeiger jedoch immer noch nichts finden. Die unter stackoverflow.com/questions/150753/… beschriebenen Lösungsansätze wären auch für die Spieleentwicklung hilfreich.
Jules
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.