Speicher Problem

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

maanee9

Betreff: Speicher Problem

BeitragMi, März 24, 2010 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute,

ich habe gerade das Problem das mein Arbeitsspeicher vollgemüllt wird durch das abfeuern
meiner Waffe da anscheinden die Links zum Objekt nicht gelöscht werden.
Vielleicht mach ich ja irgendwas falsch.

Würd mich freuen wenn wer einem Bmax Noob wie mir den Fehler erklären könnte.

Danke

PS: Ich packe alle meine Objekte in eine einzige TList und lass die mit "for .. eachin" durchlaufen.

Code: [AUSKLAPPEN]
''''''''''''''''' HIER KOMMT MEINE KLASSE
Type tweapon Extends bewegung

   Field damage:Int;
   Field wdelay:Int;
   Field reichweite:Int;
   Global weapon1_timer:Int;
   
   Field ursprung_x:Int;
   Field ursprung_y:Int;

   Function shootweapon(wname:String,wdamage:Int,wspeed:Int,wtileset:String,x:Int,y:Int,ausrichtung:Int, mdelay:Int, reichweite:Int)
   
      Local weapon:tweapon = New tweapon;
      
      weapon.wdelay = mdelay;
      
      If weapon1_timer
         If weapon1_timer <= MilliSecs()
            weapon1_timer = MilliSecs()+weapon.wdelay;
         Else
            Return;
         End If
      Else
         weapon1_timer = MilliSecs()+weapon.wdelay;
      EndIf
      
      weapon.name = wname;
      weapon.damage = wdamage;
      weapon.speed = wspeed;
      weapon.x = x;
      weapon.y = y;
      weapon.ursprung_x = x;
      weapon.ursprung_y = y;
      
      weapon.ausrichtung = ausrichtung;
      weapon.reichweite = reichweite;
      weapon.tileset = LoadImage(wtileset);      
      
      If Not objektliste Then objektliste = CreateList();
      objektliste.addlast(weapon);
      
      weapon = Null;
   
   EndFunction      

EndType

''''''''''''''''' HIER ENDET SIE


''''''''''''''''' HIER KOMMT DER TEIL IN MEINER UPDATE FUNCTION

         Local laserUp:tweapon = tweapon(objects);
         If laserUp
         
            laserUp.x = laserUp.x + laserUp.speed*Cos(laserUp.ausrichtung)*delta.time();
            laserUp.y = laserUp.y + laserUp.speed*Sin(laserUp.ausrichtung)*delta.time();
         
            SetRotation(laserUp.ausrichtung);
            MidHandleImage(laserUp.tileset);
            DrawImage(laserUp.tileset,laserUp.x,laserUp.y);
            SetRotation(0);
         

            '' Siehe wiki Kreis Parameterdarstellung !!!
            If laserUp And laserUp.x > (laserUp.ursprung_x+(laserUp.reichweite*Cos(laserUp.ausrichtung))) And Cos(laserUp.ausrichtung) >= 0
               objektliste.Remove(laserUp);
            Else If laserUp And laserUp.x < (laserUp.ursprung_x+(laserUp.reichweite*Cos(laserUp.ausrichtung))) And Cos(laserUp.ausrichtung) <= 0
               objektliste.Remove(laserUp);
            Else If laserUp And laserUp.y > (laserUp.ursprung_y+(laserUp.reichweite*Sin(laserUp.ausrichtung))) And Sin(laserUp.ausrichtung) >= 0
               objektliste.Remove(laserUp);
            Else If laserUp And laserUp.y < (laserUp.ursprung_y+(laserUp.reichweite*Sin(laserUp.ausrichtung))) And Sin(laserUp.ausrichtung) <= 0
               objektliste.Remove(laserUp);
            End If   
                     
            laserUp = Null;
         
         EndIf

''''''''''''''''' HIER ENDET ER


''''''''''''''''' UND HIER WIRD SIE ERSTELLT
         Local pship:tplayership = tplayership(objects);
         If pship
            
            If KeyDown(key_lcontrol)
               tweapon.shootweapon("Plasma",100,450,"dat/theplasma.png",pship.x,pship.y,pship.ausrichtung,150,300);                        
            EndIf

Xeres

Moderator

BeitragMi, März 24, 2010 21:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Edit: Sicher das die Bedinungen fürs entfernen aus der Liste jemals ausgeführt werden? Bau ein DebugStop an die Stellen ein.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
  • Zuletzt bearbeitet von Xeres am Mi, März 24, 2010 21:03, insgesamt einmal bearbeitet

d-bug

BeitragMi, März 24, 2010 21:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Außerdem würd ich mal aufhören bei jedem Schuss das Image neu zu laden.
Leg es doch in eine global Variable innerhalb des Types TWeapon und zeichne es von da aus.

maanee9

BeitragDo, März 25, 2010 10:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Das das Remove von Tlist ausgeführt wird bin ich mir sicher.

Schließlich verschwinden die Objekte nach der vorhergesehen länge die durch die ifs abgefragt werden. (Was ohne das Remove ja nicht passieren würde)

Bild ok. Bild laden pack ich in ne globale Variable

maanee9

BeitragDo, März 25, 2010 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab jetzt das Timage global gesetzt. Das bringt schon mal viel.

Allerdings hab ich immernoch das Gefühl das die Objekte nicht gelöscht werden weil der verbrauchte immernoch größer wird. Wenn auch jetzt drastisch weniger.

Also ca. 1kb pro 500 Schuss.

hmm. aber damit kann ich noch leben.
Vielleicht find ich das Problem selber noch irgendwann

mpmxyz

BeitragDo, März 25, 2010 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Einen Tip für später:
Beim Weiterlernen solltest du auf die Methode "Delete" achten.
Mit der kann man nämlich sichtbar machen, ob und wann ein Objekt gelöscht wurde.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

d-bug

BeitragDo, März 25, 2010 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Was mir jetzt noch spontan einfällt, wenn ich den Code da oben noch mal durchlese:

Du solltest TWeapon.name ebenfalls nullen. Es handelt sich da um einen String. Strings werden nicht automatisch vom GC genullt, wenn ich mich da recht entsinne. Vorallem must du darauf achten, dass du TWeapon.name nullst, bevor du die eigentliche Instanz nullst. Das kannst du wunderbar in der Methode Delete machen, wie mxyzdings schon zum besten gab.

Außerdem ist es nicht mehr nötig MidhandleImage bei jedem Schleifendurchlauf zu verwenden, da du das Image ja nicht jedes mal neu lädst. Stattdessen kannst du es jetzt ein mal direkt nach dem laden des Images in die globale Variable anwenden.
  • Zuletzt bearbeitet von d-bug am Do, März 25, 2010 19:59, insgesamt einmal bearbeitet

maanee9

BeitragDo, März 25, 2010 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab schon gesehen das es sowas gibt.

Muss mir am Wochende dann mal die nächsten Tuts anschauhen.



Wobei ich jetzt schon seh das ich hier ein bisschen mehr auf die Ressourcen achten muss.
(Programmier normal Java und bei Webseiten mit PHP5)

Bin in da wohl ein bisschen verwöhnt in bezug arbeitsspeicher Wink

mpmxyz

BeitragDo, März 25, 2010 20:07
Antworten mit Zitat
Benutzer-Profile anzeigen
@d-bug: Strings werden nicht freigegeben? Das würde ich wissen!
(Ich habe ein nur so mit Strings herumschleudernes Programm geschrieben und keine Probleme.)
Edit: In mehr als 3 Minuten String-Spammen ist kein einziges Byte hinzugekommen.
@maanee9:
So viel ist nicht anders.
Im Gegensatz zum Java-GC löst dieser Garbage-Collector prinzipbedingt keine zyklischen Referenzen. (z.B. A->B->C->A)
Das ist der einzige Unterschied.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

maanee9

BeitragDo, März 25, 2010 21:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
@d-bug: Strings werden nicht freigegeben? Das würde ich wissen!
(Ich habe ein nur so mit Strings herumschleudernes Programm geschrieben und keine Probleme.)
Edit: In mehr als 3 Minuten String-Spammen ist kein einziges Byte hinzugekommen.


Ich hab jetzt mal "weapon.name" genullert.
Jetzt kommt scheint das Problem endgültig gelöst zu sein.

Zitat:
So viel ist nicht anders.
Im Gegensatz zum Java-GC löst dieser Garbage-Collector prinzipbedingt keine zyklischen Referenzen. (z.B. A->B->C->A)
Das ist der einzige Unterschied.


Interresant. Um ehrlich zu sein hab ich mir bisher einfach noch nie Ganken über SpeicherRessourcen gemacht.
Der Java-GC wirds schon richten. (C Programmierer bitte weghören Laughing )



Naja. Problem jedenfalls vorerst gelöst.
Jetzt weiter mit den Tuts,

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group