Arbeitsspeicherproblem mit meinem 3dgsPurePacker

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Tracker
Beiträge: 53
Registriert: 22.11.2005 21:46
Computerausstattung: Intel Core 2 Quad Q6600, 2,4 GHZ, 2 GB RAM, NVidia GeForce 8600 GT 512 MB, Windows XP Prof. SP3, PureBasic v4.51

Arbeitsspeicherproblem mit meinem 3dgsPurePacker

Beitrag von Tracker »

Ich arbeite noch mit PureBasic 3.94 und habe auf Basis von Mischas toller PackerEx_Include für einen Freund einen Packer geschrieben, mit dem er seine GameStudio-Spiele, Demos und Screensaver in einer selbstentpackenden EXE-Datei packen kann.
Das Spiel wird in einem temporären Verzeichnis entpackt, gestartet und das Verzeichnis nach Programmende wieder entfernt.

Hier eine Hardcopy meiner Beta vom 02.04.2006:
Bild

Eigentlich funktioniert mein Programm ganz gut, aber in Verbindung mit großen Spielen habe ich folgendes Problem:

Wie kann ich den von ExtractPack(TempDir$) benötigten Arbeitsspeicher (ca. 350 MB) wieder freigeben ohne das Programm zu beenden?

Hier ein Auszug meines Quellcodes zum Entpacken:
;--- Spiel in temporärem Unterverzeichnis entpacken ---
If OpenFilePack(PackName$,1,listcallback) = 0
Text$ = "Das Archiv kann nicht geöffnet werden!"
MessageRequester(" 3dgsPurePacker",Text$,0 | #MB_ICONWARNING)
End
EndIf
ExtractPack(TempDir$)
CloseFilePack(listcallback)

;--- Spiel bzw. Screensaver starten ---
If RunProgram(TempName$,"",TempDir$,1) = 0
Text$ = "Das Programm kann nicht gestartet werden!"
MessageRequester(" 3dgsPurePacker",Text$,0 | #MB_ICONWARNING)
End
EndIf

;--- Temporäre Verzeichnisse löschen ---
If LCase(CheckDelete$) = "j"
DeleteDirectory(TempDir$, "*.*",#PB_FileSystem_Recursive|#PB_FileSystem_Force)
EndIf
Das Spiel meines Freundes hat 182 MB.
Nach dem Packen sind es noch 102 MB.

Mein PC hat 512 MB Arbeitsspeicher.
Die Auslagerungsdatei zeigt laut Task-Manager vor dem Entpacken 262 MB an.

Nach OpenFilePack(PackName$,1,listcallback) werden 440 MB angezeigt.
Nach ExtractPack(TempDir$) sind es bereits 616 MB.

Leider wird der Speicher nach ExtractPack nicht mehr freigegeben, was die Auslagerungsdatei weiter vergrößert.

Mit RunProgram(TempName$,"",TempDir$,1) wird das Spiel gestartet und die Auslagerungsdatei auf 840 MB aufgeblasen.
Der Entpacker wartet, bis das Spiel beendet ist und löscht anschließend wieder das temporäre Verzeichnis.

Das ungepackte Spiel benötigt zum Start 40 Sekunden bei "nur" 490 MB Auslagerungsdatei.
Das sind immerhin 350 MB weniger Arbeitsspeicherbedarf, als bei der gepackten Version.
Das gepackte Spiel benötigt bedingt durch die große Auslagerungsdatei von 840 MB zum Start über zwei Minuten.

Ich darf aber den Entpacker nicht vor Spielende beenden, weil ich anschließend wieder das temporäre Spieleverzeichnis entfernen muss.
RunProgram(TempName$,"",TempDir$,0) scheidet also als Lösung aus.

Gibt es eine Möglichkeit, den von ExtractPack() zum Entpacken benötigten Arbeitsspeicher (ca. 350 MB) vor Spielbeginn wieder freizugeben, ohne den Entpacker vorzeitig zu beenden?

(Wer möchte, kann meine Beta-Version vom 02.04.2006 unter folgendem Link downloaden und ausprobieren:
http://www.projekt-3d.de/Tracker60/3dgs ... r_Beta.zip
Was noch fehlt, sind eine deutsche und eine englische CHM-Hilfedatei, die ich noch erstellen muss)
Ein fehlerfreies Programm ist der Traum jedes Programmierers
Benutzeravatar
Tracker
Beiträge: 53
Registriert: 22.11.2005 21:46
Computerausstattung: Intel Core 2 Quad Q6600, 2,4 GHZ, 2 GB RAM, NVidia GeForce 8600 GT 512 MB, Windows XP Prof. SP3, PureBasic v4.51

Beitrag von Tracker »

Ich habe mir jetzt so geholfen, dass ich die selbstentpackende EXE-Datei zweimal starte.
Beim ersten Start wird überprüft, ob das entpackte Spiel bereits existiert und falls ja, der Entpackvorgang übersprungen und das Spiel gestartet.
Falls nein, wird das Spiel entpackt und mit RunProgram(PackName$,"",PackDir$,0) die selbstentpackende EXE-Datei beendet und erneut gestartet.
Durch das Beenden des ersten Aufrufs wird der vom Entpacken belegte Arbeitsspeicher wieder freigegeben.
Weil die entpackte Version ja jetzt existiert, wird das Entpacken übersprungen, das Spiel gestartet und wenn man das so eingestellt hat, das temporäre Spieleverzeichnis nach Spielende wieder entfernt.

Dieser Weg funktioniert, aber ich es hätte mich schon interessiert, ob der vom Entpacken benötigte Arbeitsspeicher nicht doch irgendwie zur Laufzeit freigegeben werden kann, ohne das Programm zu beenden.

Der Downloadlink enthält nun die korrigierte Beta vom 4.12.2006.
Ein fehlerfreies Programm ist der Traum jedes Programmierers
Antworten