Speicher Problem
Übersicht

![]() |
maanee9Betreff: Speicher Problem |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
![]() |
mpmxyz |
![]() Antworten mit 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. @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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Naja. Problem jedenfalls vorerst gelöst. Jetzt weiter mit den Tuts, |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group