Speicherverwaltung von Blitz [erledigt/dummer d:bug-fehler]
Übersicht

![]() |
d-bugBetreff: Speicherverwaltung von Blitz [erledigt/dummer d:bug-fehler] |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kann es denn wirklich war sein, das bei BB der Speicherverbrauch eines Images steigt, wenn man via ql:Imagebuffer() darauf zugreift und diverse andere Sachen auf das Image zeichnet ? Ich frage, weil mir dieses bei debuggen von XUI2 aufviel. Also ich schrieb eine neue GFX-Routine und fragte sie vor dem zeichnen und nach dem Zeichnen mit ql:AvailVidMem() ab zog die beiden ergebnisse voneinander ab. Beim ersten Durchlauf verbrauchte ein komplettes Fenster dann 1MB. Nach dem zweiten Durchlauf verbrauchte es dann schon 2MB dann 3MB usw. usw. usw... Alles was ich machte war ein paar Images auf den Imagbuffer mit DrawImage zu zeichnen ![]() Lange Rede kurzer Sinn... VERDAMMT, das kann doch gar nicht sein, oder ? ![]() Nun zur Kernfrage, hab ich einen Denkfehler in meiner Theorie, oder hat Blitz eine echt beschissene Speicherverwaltung ? [EDIT]quick links vergessen X)[/EDIT] |
||
- Zuletzt bearbeitet von d-bug am Sa, Aug 27, 2005 13:15, insgesamt 2-mal bearbeitet
KHORN |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
FreeImage löscht angeblich nur ein Bild, was mit LoadImage geladen wurde und nicht mit CreateImage.
BlitzBase : Zitat: Diese Anweisung entfernt ein vorher mit LOADIMAGE geladenes Bild aus dem Speicher. Dadurch wird mehr Speicher frei. Dies sollte möglichst angewendet werden, um den Speicher zu schonen - besonders bei älteren Rechnern wird es da kritisch.
Frag mich nicht wie man ein Bild löscht was mit CreateImage erstellt wurde ![]() (Ich hoffe ich hab nichts falsch verstanden ![]() EDIT { http://blitzbase.de/befehle2d/createimage.htm Zitat: Beachte, dass dieser Befehl überlegt eingesetzt werden muss. Jedes Bild kostet etwas an Grafikspeicher. Bei vielen älteren Rechnern ist die Grenze schnell erreicht. Benutze FREEIMAGE, um ein Bild wieder zu löschen. Lol... Da macht mich BlitzBase ein bissl KonfuZe ?¿? } Gruß KHORN |
||
![]() |
d-bug |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ne, ne, ql:freeimage löscht definitiv alles was sich bild schimpft und nicht festgenagelt wurde ![]() ![]() |
||
Apocalyptic |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich habe gerade versucht, dieses Phänomen mit sinnlos aneinander gereihten Befehlen zu reproduzieren:
Code: [AUSKLAPPEN] Img1=CreateImage(100,100)
Img2=CreateImage(50,50) m1=AvailVidMem() For i=0 To 6000 SetBuffer ImageBuffer(Img1) Cls Color 255,255,0 Rect 0,0,100,100,0 SetBuffer ImageBuffer(Img2) Color 255,255,255 Rect 0,0,50,50 Color 255,0,0 Rect 5,5,40,40 SetBuffer ImageBuffer(Img1) DrawBlock Img2,25,25 Next m2=AvailVidMem() SetBuffer FrontBuffer() Text 0,0,"Grafikspeicher vorher : "+m1 Text 0,15,"Grafikspeicher nachher: "+m2 Text 0,35,"Differenz: "+(m2-m1) DrawBlock Img1,0,70 WaitKey() Bei mir ändert sich der verfügbare Grafikspeicher nicht. Kannst du den Fehler mit einem anderen Code reproduzieren? Denn ohne den Code zu kennen würde ich den Fehler im selbigen suchen ![]() |
||
Suum cuique
[ www.ffs-net.de.vu ] [ Raycaster ] |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Da darf sich der Speicher auch nicht ändern. Warum sollte er?
Vor dem ersten Messen erzeugst du 2 Images und beim 2. Messen existieren diese immer noch. Da kann sich nix ändern die bildgrösse im speicher ändert sich nicht, nur weil du 6000 mal draufzeichnest oder sonst etwas machst. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Apocalyptic |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Erm Dreamora... darum ging es. d:bug meint, im ImageBuffer Befehl sei ein Bug, den ich nicht nachvollziehen kann...
d:bug hat Folgendes geschrieben: Kann es denn wirklich war sein, das bei BB der Speicherverbrauch eines Images steigt, wenn man via ImageBuffer() darauf zugreift und diverse andere Sachen auf das Image zeichnet ?
|
||
Suum cuique
[ www.ffs-net.de.vu ] [ Raycaster ] |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich habe nur versucht zu erläutern, warum wegen dem zeichnen auf einen Buffer, der Speicher nicht steigen kann. Denn die Abmessung und Farbtiefe des Bildes ändert sich nicht, insofern kann auch die Grösse im Grafikspeicher nicht ändern. | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Apocalyptic |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Dass sich beim Speicherverbrauch nichts ändern sollte bzw. theoretisch nichts ändern kann, war von vornerein klar. Da d:bug aber von einem Bug innerhalb des ImageBuffer-Befehls ausgeht, sollte man die Diskrepanz zwischen Praxis und Theorie nicht außer Acht lassen ![]() |
||
Suum cuique
[ www.ffs-net.de.vu ] [ Raycaster ] |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Oder ein übersehenes Detail im Code.
Solange er kein Codebeispiel liefern kann, dass das Problem zeigt, halte ich insofern dem "wie es sein sollte und bei jedem anderen ist" Zustand nach ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Apocalyptic |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Dieser Meinung bin ich nach dem von mir geposteten Code ebenfalls:
Irgendwo in d:bugs Code scheint sich ein Fehler eingeschlichen zu haben. Q.e.c. (Quod erit convictum) ![]() (Mit meinen vorangegangenen Posts wollte ich nur auf die von dir gezeigte Abneigung ("Es darf nicht sein, was nicht sein darf") hinweisen ![]() |
||
Suum cuique
[ www.ffs-net.de.vu ] [ Raycaster ] |
![]() |
d-bug |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nah, Jungens, nun streitet euch mal nicht ![]() Es ist mir durchaus klar, daß das eigentlich garnicht sein darf, aber genau das ist es was mich so irritiert. Diese Function ist wahrscheinlich für den Membug verantwortlich (Achtung lang und unübersichtlich für das ungeschulte XUI2 Auge) : Code: [AUSKLAPPEN] Function XUI2_WindowCreateForm (gad.xui2window)
If gad <> Null If gad\closed = False Local startmem = AvailVidMem(),starttime# = MilliSecs() Local x,y,w,h Local tempbuffer,tempstring$,tempA,tempB Local seek Local formoffset = 0 Local state = 0 Local stateoffset = 0 Local temp[11] ;Buffer zwischenspeichern tempbuffer = GraphicsBuffer() ;Höhe festlegen If gad\minimized h = gad\th Else h = gad\h If gad\option And 1 formoffset = gad\th - gad\dat\integer_data[14] EndIf EndIf ;vorhandenes Bild löschen If gad\rebuild = True If gad\image <> 0 FreeImage gad\image If gad\tempimage <> 0 FreeImage gad\tempimage EndIf If gad\image = 0 gad\image = CreateImage(gad\w,h) gad\recalc = True gad\rebuild = False EndIf If gad\recalc = True SetBuffer ImageBuffer(gad\image) ;Form löschen Color 255,0,255 Rect 0,0,gad\w,h,1 ;Status des Fensters auswerten If xui2\actwindow <> gad state = 1 ;- GFX Form erstellen ----------------------------------------------------------------------- If gad\minimized = False ;Hintergrund einzeichnen Color 0,0,gad\dat\integer_data[6] Rect 0,0,gad\w,gad\h,1 If gad\dat\string_data[1] <> "" temp[1] = LoadImage(gad\dat\path+gad\dat\string_data[1]) XUI2_DrawBackground (gad\image,temp[1],0,formoffset,gad\w,gad\h-formoffset,gad\dat\integer_data[7]) EndIf ;Menüzeile einzeichnen If gad\option And 1024 Color 0,0,gad\dat\integer_data[69] Rect 0,gad\th,gad\w,gad\menuh,1 If gad\dat\string_data[10] <> "" temp[2] = LoadImage(gad\dat\path+gad\dat\string_data[10]) XUI2_DrawBackground (gad\image,tempA,0,gad\th,gad\w,gad\menuh,gad\dat\integer_data[70]) EndIf If gad\dat\string_data[9] <> "" temp[3] = LoadAnimImage(gad\dat\path+gad\dat\string_data[9],gad\dat\integer_data[63],gad\dat\integer_data[64],0,2) temp[4] = CreateImage (gad\w,gad\menuh) SetBuffer ImageBuffer(temp[4]) XUI2_ImageScale (temp[3],0,0,gad\w,gad\menuh,gad\dat\integer_data[65],gad\dat\integer_data[66],gad\dat\integer_data[67],gad\dat\integer_data[68],state) MaskImage temp[4],255,0,255 SetBuffer ImageBuffer(gad\image) DrawImage temp[4],0,gad\th Else SetBuffer ImageBuffer(gad\image) XUI2_DrawLine (1,formoffset+gad\menuh-1,gad\w-1,True,True) EndIf EndIf ;Statuszeile einzeichnen If gad\option And 2048 Color 0,0,gad\dat\integer_data[79] Rect 0,gad\h-gad\statush,gad\w,gad\statush,1 If gad\dat\string_data[12] <> "" temp[5] = LoadImage(gad\dat\path+gad\dat\string_data[12]) XUI2_DrawBackground (gad\image,tempA,0,gad\h-gad\statush,gad\w,gad\statush,gad\dat\integer_data[80]) EndIf If gad\dat\string_data[11] <> "" temp[6] = LoadAnimImage(gad\dat\path+gad\dat\string_data[11],gad\dat\integer_data[73],gad\dat\integer_data[74],0,2) temp[7] = CreateImage (gad\w,gad\statush) SetBuffer ImageBuffer(temp[7]) XUI2_ImageScale (temp[6],0,0,gad\w,gad\statush,gad\dat\integer_data[75],gad\dat\integer_data[76],gad\dat\integer_data[77],gad\dat\integer_data[78],state) MaskImage temp[7],255,0,255 SetBuffer ImageBuffer(gad\image) DrawImage temp[7],0,gad\h-gad\statush Else SetBuffer ImageBuffer(gad\image) XUI2_DrawLine (1,gad\h-gad\statush-1,gad\w-1,True,True) EndIf EndIf ;Rahmen einzeichnen If gad\frame If gad\dat\string_data[0] <> "" temp[8] = LoadAnimImage(gad\dat\path+gad\dat\string_data[0],gad\dat\integer_data[0],gad\dat\integer_data[1],0,2) temp[9] = CreateImage (gad\w,gad\h-formoffset) SetBuffer ImageBuffer(temp[9]) XUI2_ImageScale (temp[8],0,0,gad\w,gad\h-formoffset,gad\dat\integer_data[2],gad\dat\integer_data[3],gad\dat\integer_data[4],gad\dat\integer_data[5],state) MaskImage temp[9],0,255,255 SetBuffer ImageBuffer(gad\image) DrawImage temp[9],0,formoffset Else SetBuffer ImageBuffer(gad\image) XUI2_DrawRect (0,formoffset,gad\w,gad\h-formoffset,False,True,1+2+4+8) EndIf EndIf ;Größenänderungsecke einzeichnen If gad\option And 64 If gad\maximized = False If gad\dat\string_data[8] <> "" temp[10] = LoadAnimImage(gad\dat\path+gad\dat\string_data[8],gad\dat\integer_data[60],gad\dat\integer_data[61],0,2) MaskImage temp[10],255,0,255 SetBuffer ImageBuffer(gad\image) DrawImage temp[10],gad\w-gad\dat\integer_data[60],gad\h-gad\dat\integer_data[61] EndIf EndIf EndIf EndIf ;- GFX Titlebar erstellen ------------------------------------------------------------------- If gad\option And 1 If gad\minimized stateoffset = 2 ;Titelzeile einzeichnen If gad\dat\string_data[2] <> "" temp[11] = LoadAnimImage(gad\dat\path+gad\dat\string_data[2],gad\dat\integer_data[8],gad\dat\integer_data[9],0,4) SetBuffer ImageBuffer(gad\image) XUI2_ImageScale (temp[11],0,0,gad\w,gad\th,gad\dat\integer_data[10],gad\dat\integer_data[11],gad\dat\integer_data[12],gad\dat\integer_data[13],state+stateoffset) Else SetBuffer ImageBuffer(gad\image) If gad\minimized XUI2_DrawRect (0,0,gad\w,gad\th,True,True,1+2+4+8) Else XUI2_DrawRect (0,0,gad\w,gad\th,True,True,1+2+4) EndIf EndIf ;Farbverlauf einzeichnen If gad\dat\integer_data[15] = 1 Select state Case 0 tempA = gad\dat\integer_data[17] tempB = gad\dat\integer_data[18] Case 1 tempA = gad\dat\integer_data[19] tempB = gad\dat\integer_data[20] End Select SetBuffer ImageBuffer(gad\image) XUI2_DrawGradient (tempA,tempB,gad\dat\integer_data[21],gad\dat\integer_data[23],gad\w-gad\dat\integer_data[21]-gad\dat\integer_data[22],gad\th-gad\dat\integer_data[23]-gad\dat\integer_data[24],gad\dat\integer_data[16]) EndIf ;Text einzeichnen If gad\caption <> "" tempA = LoadFont(gad\dat\string_data[3],gad\dat\integer_data[25],gad\dat\integer_data[26],gad\dat\integer_data[27],gad\dat\integer_data[28]) tempC = gad\w - (2 * gad\dat\integer_data[31]) tempE = XUI2_TextWidth(gad\caption,tempA) If gad\buttonoffset tempC = tempC - gad\buttonoffset If gad\icon tempC = tempC - ImageWidth(gad\icon) - gad\dat\integer_data[39] If tempC < tempE tempstring = XUI2_FitString(gad\caption,tempC,"...") Else tempstring = gad\caption EndIf w = XUI2_TextWidth(tempstring,tempA) h = XUI2_TextHeight(tempstring,tempA) Select gad\dat\integer_data[33] Case 1 x = gad\dat\integer_data[31] If gad\icon <> 0 If gad\dat\integer_data[38] = 1 x = gad\dat\integer_data[39] + ImageWidth(gad\icon) + gad\dat\integer_data[31] EndIf EndIf If gad\buttonoffset If gad\dat\integer_data[43] = 1 x = gad\buttonoffset + gad\dat\integer_data[31] EndIf EndIf Case 2 If gad\icon <> 0 tempG = gad\w - gad\buttonoffset - ImageWidth(gad\icon) - gad\dat\integer_data[39] Else tempG = gad\w - gad\buttonoffset EndIf x = (gad\w/2) - (w/2) If gad\icon <> 0 If gad\dat\integer_data[38] = 1 x = gad\dat\integer_data[39] + ImageWidth(gad\icon) + ((tempG/2) - (w/2)) EndIf EndIf If gad\buttonoffset If gad\dat\integer_data[43] = 1 x = gad\buttonoffset + ((tempG/2) - (w/2)) EndIf EndIf Case 3 x = gad\w - gad\dat\integer_data[31] - w If gad\icon <> 0 If gad\dat\integer_data[38] = 2 x = gad\w - gad\dat\integer_data[39] - ImageWidth(gad\icon) - gad\dat\integer_data[31] - w EndIf EndIf If gad\buttonoffset If gad\dat\integer_data[43] = 1 x = gad\w - gad\buttonoffset - gad\dat\integer_data[31] - w EndIf EndIf End Select y = (gad\th/2) - (h/2) Select state Case 0 If gad\dat\integer_data[34] Color 0,0,gad\dat\integer_data[37] XUI2_Text (x+gad\dat\integer_data[35],y+gad\dat\integer_data[36],tempstring,0,1,tempA) EndIf Color 0,0,gad\dat\integer_data[29] Case 1 Color 0,0,gad\dat\integer_data[30] End Select XUI2_Text (x,y,tempstring,0,1,tempA) FreeFont tempA EndIf ;Icon einzeichnen If gad\icon <> 0 Select gad\dat\integer_data[38] Case 1 x = gad\dat\integer_data[39] Case 2 x = gad\w - gad\dat\integer_data[39] - ImageWidth(gad\icon) End Select y = (gad\th/2) - (ImageHeight(gad\icon)/2) + gad\dat\integer_data[40] Select state Case 0 tempA = gad\dat\integer_data[41] Case 1 tempA = gad\dat\integer_data[42] End Select XUI2_DrawIcon (gad\icon,gad\image,x,y,tempA,0,$FFFF00FF) EndIf EndIf SetBuffer tempbuffer gad\tempimage = CopyImage(gad\image) MaskImage gad\image,255,0,255 For i = 0 To 11 FreeImage temp[i] Next EndIf DebugLog "<"+gad\caption+"> VMEM-usage : "+((startmem - AvailVidMem())/1024)+"/"+(AvailVidMem()/1024)+" / Looptime : "+((Float(MilliSecs()) - starttime)/1000.0) EndIf EndIf End Function und hier noch ein link zum testen, mit zwei exen. http://d-bug.future-coding.de/...MEMBUG.rar (1.5mb) Den kompletten code hier zu pasten wäre glaube ich extrem schlecht, außerdem bräuchte ich dafür mindestens 20 threads ![]() Klickt mal zwischen den beiden fenstern hin und her und beobachtet dabei die VMEM-Anzeige am unteren Bildschirmrand ![]() greetz |
||
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Ich vermute einfach mal, dass Dir wahrscheinlich irgendwo ein Image auf der Strecke bleibt ... ein "temporäres", dass Du womöglich übersehen hast? ![]() Deinen Code sorgfältig durchzusehen ist mir jetzt aber grad n bissel zu viel... ![]() Also bleibt es bei meiner Vermutung. |
||
Apocalyptic |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hm. Deswegen meinte ich ja: Mit einem anderen Code reproduzieren... Nur wenige werden die Überwindung aufbringen, sich in einen derart langen, zusammenhangslosen Code einzulesen ![]() Mal was anderes: Die AvailVidMem()-Anzeige in der Exe ist wohl in kb und nicht in mb angegeben, oder? ![]() Und sollte es hier nicht eher so aussehen?BlitzBasic: [AUSKLAPPEN] If gad\rebuild = True Könnte es vielleicht sein, dass gad\rebuild nicht dann True ist, wann es True sein sollte? Denn eigentlich sollte der ursprüngliche Code einen Fehler produzieren, wenn gad\rebuild=True ist: Das Bild mit der Speicheradresse gad\image wird gelöscht, die Variable gad\image beinhaltet aber immer noch die Speicheradresse und ist somit ungleich null, was zur Folge hat, dass kein neues Bild erstellt wird. Wäre gad\rebuild also nicht True, würde gad\tempimage nie aus dem Speicher gelöscht werden, was auch den steigenden Speicherverbrauch erklären würde. Aber wie bereits erwähnt: Ohne Zusammenhang kann man mit dem Code nicht viel anfangen ![]() If gad\tempimage <> 0 FreeImage gad\tempimage:gad\tempimage=0 Ich weiß nicht, ob Folgendess hier reingehört (ist wahrscheinlich nur bei der "Demo" der Fall): Beim Klick auf den Rand eines Fensters wird der "Größe-Ändern"-Cursor angezeigt, das Programm stürzt aber ab (MAV). Oder ist beim Ändern der Größe des Fensters gad\rebuild=True? Dann tritt der oben erläuterte Fehler ein. |
||
Suum cuique
[ www.ffs-net.de.vu ] [ Raycaster ] |
![]() |
d-bug |
![]() Antworten mit Zitat ![]() |
---|---|---|
O.K. eben, weil dieser code sehr Umfangreich ist und keiner lust hat sowas zu lesen, habe ich ihn beim ersten post nicht einbezogen.
hm, meine Vermutung war auch schon, daß FreeImage einfach nicht schnell genug ist und der pointer des Images nicht rechtzeitig gelöscht wird. Mal austesten. Danke euch trotzdem allen, daß ihr mir helfen möchtet ! Hatte mir auch schon gedacht, daß der bug nicht von Blitz kommt. Hatte nur gehofft, daß einer von euch hier, schonmal ein ähnliches Phenomen hatte, oder davon hörte, damit ich diese Vermutung gänzlich auschließen kann ! @Apocalyptic gad\tempimage wird zur zeit nicht nur nicht abgefragt, sondern auch nicht benutzt ![]() ![]() @Ava Schön das du auch mal wieder da bist ! Was ist denn eigentlich aus deinem Shooter mit den geilen GFX geworden ? Den aus dem WIP thread meine ich. ![]() [EDIT] ![]() ![]() ![]() ![]() ![]() ![]() [/EDIT] greetz + thx |
||
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
d:bug hat Folgendes geschrieben: @Ava
Schön das du auch mal wieder da bist ! Was ist denn eigentlich aus deinem Shooter mit den geilen GFX geworden ? Den aus dem WIP thread meine ich. ![]() Oh, das ist ja nun auch schon so lange her. Tja hm, wären mir damals nicht die Probleme mit meinem Rechner (meiner Festplatte ![]() ![]() ![]() |
||
![]() |
d-bug |
![]() Antworten mit Zitat ![]() |
---|---|---|
hm, schade, denn im rendern warst/bist du ziemlich klasse ![]() ![]() greetz |
||
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Ja, Rendern kann ich soweit erstmal, dass ich damit einigermassen zufrieden bin ... nun möchte ich noch Pixelkönigin werden! ![]() Deine Bedenken wegen BlitzMax kann ich sehr gut nachvollziehen ... hach, und besonders für eine GUI bietet Max soviele Vorzeile - aber erst einmal etwas schon so weit entwickeltes wie Deine XUI fertigzustellen, ist natürlich viel schöner, als das die ganze Arbeit im Papierkorb landet und noch mal alles von Vorne beginnt! Ach übrigens.... schön das Du den Fehler nun doch noch finden konntest! ![]() |
||
![]() |
d-bug |
![]() Antworten mit Zitat ![]() |
---|---|---|
hm, der pixel-gott status ist aber schon an divi vergeben worden ![]() |
||
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Ja, das weis ich doch. ![]() Ich möchte auch gar nicht versuchen, ihn von seinem Podest zu schubsen *g* dafür respektiere und bewundere ich seine Pixelkunst viel zu sehr, es wäre anmaßend von mir, auch nur darüber nachzudenken. ![]() |
||
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
entschuldigt bitte, aber was ist das denn hier für eine Getriefe und Geschleime ... ??? ![]() Als müsstet ihr allen vorhalten wie schlecht sie Grafiken erstellen können. Naja, vielleicht redet ja nur der Neid in mir. ![]() Übrigens: Willkommen zurück Ava MfG D2006 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group