genau das meine ich mit dem gebündelten freigeben. Die app saugt sich voll und die gebündelte Freigabe scheint nur noch beim Maximieren/Minimieren statt zu finden. Daher frage ich auch ob man den Zyklus vielleicht selber anschubsen kann, bei jedem FlipBuffers oder großen Main loop.
Ich benutze jetzt gerade den Debugger. Es ist viel langsamer (nur ganz wenige FPS) aber der Effekt macht sich dennoch etwas bemerkbar. Wenn das Fenster über die Desktopleiste minimiert/maximiert wird, tritt wieder der Freigabe Effekt auf. Der Verbrauch sinkt von 30MB auf etwa 10MB.
Was ich in beiden Programmen tue: viele Strings verarbeiten. Das erste Programm bei dem mir das auffiel ist ein Webserver (mit dynamischer Webseiten Erzeugung und alles was dazu gehört). Jetzt im neuen wird auch eine Datei in eine "pseudo Konsole" (mit PB emuliertes terminal fenster auf screen mit 2D drawing gemalt) langsam ausgegeben. Wenn die Datei schnell ausgegeben wird (z.B. ohne geschwindigkeitsbegrenzung), dann tritt der Effekt nicht so schnell auf weil viel weniger Vergleiche und Datei-Häppchen verarbeitet werden. Ich emuliere eine Baudrate beim ausgeben, da wo es am meisten auffällt.
In letzterem Fall tritt das ganze besonders stark auf wenn ich das ganze indirekt laufen lasse (lua thread ruft lua thread ruft Datei-Verarbeiter auf). In meiner Pseudo konsole habe ich mir einen "type" Befehl geschrieben (Lua seitig) der die Datei "direkt" ausgibt, und einen "exec" Befehl der simple Batch dateien für diese selbstgebastelte Konsole ausführt (das Verursacht zusätzliche threads mit denen sich die Anzahl der alloc/free drastisch erhöht weil die diese Funktionen benutzen um den Stapel zu bauen und Skript-Zustand zu merken). Deswegen wird im Leerlauf und in einfachen Type der Verbrauch nur um wenige KB steigen je Sekunde steigen, bei der indirekten lua-Threads Variante über "exec <batch>" (in der batch wird der type Befehl aufgerufen) steigt der Verbrauch dann MB weise.
Und ohne vertikale Sync steigt der Verbrauch am schnellsten weil dann die Threads sehr oft nach Timeouts fragen und dies ebenso über Stringverarbeitung viel stattfindet (zwischen Lua und dem Hauptprogramm durch die Skripte).
Jetzt gibt es das Problem daß der Webserver nicht Lua benutzt sondern nur PB String Verarbeitung und Konsole. Hier wird mehrmals die Sekunde in der (realen OS) Konsole die Zeit angezeigt, neben den Zugriffen die hin und wieder reinkommen. Auch hier tritt der Effekt ein (ca. 4K die Sekunde) mit dem steigeneden Speicherverbrauch.
Erst wenn die Konsole beim WS minimiert oder maximiert wird, sinkt der Verbrauch wieder auf die typischen 8MB.
Ich benutze den Debugger, aber weil es langsamer ist tritt der Effekt nicht so stark auf.Weil je ausgegebene Zeile weniger overhead erzeugt wird (pseudo: if ellapsedmilliseconds ... print(nextdata)).
Beim derzeitigen Phenomen habe ich sogar die Wahl ob ich den Windowed Screen oder die (OS-) Konsole minimiere/maxmimiere um die Freigabe zu "erzwingen".
Ich denke es liegt irgendwie am OS vs PB Zusammenspiel.
Die Versuchsdateien die ich mir ausgeben lasse sind zwischen 200k und 4MB groß (Star Wars ASCII Animation).
Übrigens: lua meldet dann den Fehler "not enough memory", aber es findet dann ein bißchen neuen Speicher um so ca. jede zweite oder dritte Zeile wieder ausgeben zu können. Wie wenn der Zyklus für 1-2 Schritte angestoßen würde wenn der Speicher gesättigt ist, aber nicht alles durchläuft um alles freizugeben. Daher: mein Hauptprogramm stürtzt eigentlich auch nicht wirklich ab, kann aber auch nicht mehr richtig arbeiten. Die Freigabe findet nur noch statt wenn ich die Fenster minimiere/maximiere - eine andere Möglichkeit hat mir der Zufall noch nicht geboten.
Was der zuerst gepostete Code nicht nachbilden kann ist die verschachtelte, dynamische String verarbeitung wie beim Webserver oder die multi-lua-threaded Dateiausgabe...
Code: Alles auswählen
; mit dieser Procedure macht der Lua interpreter ALLE allocs / frees
;
ProcedureC.i __allocHandler(*ud, *ptr, osize, nsize)
Protected res,max
If (nsize = 0) And *ptr
;Debug "free "+osize+" *ptr "+*ptr+" *ud "+*ud
FreeMemory(*ptr);
res = #Null
ElseIf nsize<0
res = #Null
;Debug "SHOULD NOT HAPPEN nsize<0"
Else
If nsize<2
nsize=2
EndIf
If *ptr=#Null
;Debug "alloc "+osize+" -> "+nsize+" *ptr "+*ptr+" *ud "+*ud
res = AllocateMemory(nsize)
Else
;Debug "realloc "+osize+" -> "+nsize+" *ptr "+*ptr+" *ud "+*ud
;
If MemorySize(*ptr)=nsize Or osize=nsize
res=*ptr
Else
res=ReAllocateMemory(*ptr, nsize)
EndIf
EndIf
EndIf
ProcedureReturn res
EndProcedure
[/quote]