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?
Antworten:
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.
quelle