Objekte werden nicht wirklich gelöscht?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

M0rgenstern

Betreff: Objekte werden nicht wirklich gelöscht?

BeitragMi, Jun 09, 2010 22:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute.

Ich hab meine Testwegpunkte jetzt so weit, dass sie funktionieren (zwar noch als gerichtete Graphen, aber wenigstens funktionieren sie).
Ich hab auch schon einen "Gegner" der sich an ihnen orientiert.
Aber irgendwas funktioniert nicht so richtig.

Wenn der Gegner auf einen Wegpunkt zusteuert und ich diesen lösche, bevor er ihn erreicht, dann steuert der Gegner in die linke obere Bildschirmecke. Und wenn er da angekommen ist, dann steuert er wieder den ersten Wegpunkt an.
Manchmal passiert es sogar, dass er Wegpunkte ansteuert die ich kurz zuvor erst gelöscht habe. Dann aber drei oder vier Stück hintereinander.
Ich verstehe nicht warum.
Vielelciht könnt ihr mir ja helfen, das richtig abzuändern. Ich bekomme das grade nicht richtig hin.

Hier ist mal der Code für die Wegsuche:
BlitzMax: [AUSKLAPPEN]
	Method GetNewGoal()
Local TmpGoal:Twaypoint
If Goal = Null Then
If (TWaypoint.tlAllWaypoints.FirstLink() <> Null) Then
Local TmpLink:TLink = TWaypoint.tlAllWaypoints.FirstLink()
If (tmplink.Value() <> Null) Then
Goal = tmplink.Value()
EndIf
EndIf
Else
If TWaypoint(Goal) Then TmpGoal = TWaypoint(Goal)
Goal = TmpGoal.Get_Follower()

EndIf
End Method


Und hier der Code wenn ein Wegpunkt gelöscht wird:
BlitzMax: [AUSKLAPPEN]
	Method Destroy()
Local RemovedLink:TLink = tlallwaypoints.FindLink(Self)
Local BeforeLink:TLink = removedlink.PrevLink()
Local AfterLink:TLink = removedlink.NextLink()
Local RemovedWaypoint:TWaypoint
Local AfterWaypoint:TWaypoint
Local BeforeWaypoint:TWaypoint

If RemovedLink <> Null Then
If RemovedLink.Value() <> Null Then
RemovedWaypoint = TWaypoint(RemovedLink.Value())
End If
EndIf
If AfterLink <> Null Then
If AfterLink.Value() <> Null Then
AfterWaypoint = TWaypoint(AfterLink.Value())
End If
EndIf
If BeforeLink <> Null Then
If BeforeLink.Value() <> Null Then
BeforeWaypoint = TWaypoint(BeforeLink.Value())
End If
EndIf

If BeforeWaypoint <> Null Then
BeforeWaypoint.Set_Follower(AfterWaypoint)
EndIf

Self.Follower = Null
Self.fX = Null
Self.fY = Null
tlAllWaypoints.Remove(Self)
DebugLog "Wegpunkt gelöscht"
End Method


Das Problem ist eigentlich, dass der Gegner nicht in die Ecke steuern sollte, sondern dann halt den nächsten existierenden wegpunkt nehmen sollte.

Lg, M0rgenstern

ComNik

BeitragMi, Jun 09, 2010 22:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Weil du in BlitzMax nichts löschen kannst. BlitzMax ist "garbage collected", dass heisst ein sogenannter Garbage Collector läuft alle paar Millisekunden durch den Speicher und löscht alle Objekte auf die keine Referenzen mehr zeigen.

Du kannst versuchen alle Referenzen (mithilfe von = NULL) zu "nullen", dann wird das Objekt aber auch erst beim nächsten Garbage Collector Durchlauf "mitgenommen".

Du kannst den Garbage Collector zwar auch manuell laufen lassen und ihn immer aufrufen sobald du einen Waypoint gelöscht hast, aber da wäre es schon effektiver den Waypoints eine besucht Variable zu spendieren oder so.

lg
ComNik

[Edit:]Das ist nicht die Ursache (siehe Sucos Beitrag), Lösungsvorschlag weiter unten...[/Edit]
WIP: Vorx.Engine
  • Zuletzt bearbeitet von ComNik am Mi, Jun 09, 2010 22:32, insgesamt einmal bearbeitet

M0rgenstern

BeitragMi, Jun 09, 2010 22:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weiß nicht wirklich, wie eine Besucht Variable da helfen sollte. Könntest du das vllt etwas genauer erläutern?

Ich Nulle doch eigentlich alles. Ich nehm den gelöschten Wegpunkt aus der Liste und Nulle die Attribute.

Lg, M0rgenstern

Suco-X

Betreff: ......

BeitragMi, Jun 09, 2010 22:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Der GC wird da wohl nicht sein Problem sein, der Fehler liegt im Waypoint Code. Wenn du etwas aus einer Liste entfernst dann steht dir das Objekt ja nicht mehr zur Verfügung. Es bleibt nurnoch im Speicher bis der GC es löscht.
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

ComNik

BeitragMi, Jun 09, 2010 22:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, wenn du sagst
Code: [AUSKLAPPEN]

Global waypoint:TWaypoint = new TWaypoint


dann wird ein neues TWaypoint objekt erstellt, und eine Referenz (ein Zeiger) darauf zurückgegeben. Der wird dann von dir in der globalen Variable waypoint gespeichert.

Auf das Objekt zeigt nun eine Referenz.

Wenn du jetzt sagst:
Code: [AUSKLAPPEN]
waypoint = NULL


Führt die Referenz nichtmehr zum Objekt sondern ins leere. Das heisst dann, keine Referenzen mehr zeigen auf das Objekt -> es wird beim nächsten GC Durchlauf aus dem Speicher gelöscht.

Das unterscheidet BlitzMax von z.B C++, wo du jedes Objekt explizit aus dem Speicher löschen musst, wenn du es nicht mehr verwendest.

Die Sache mit der Variable ist eigentlich Unsinn, da hab ich nicht nachgedacht ^.^

Ohne jetzt deinen Code komplett gelesen zu haben, würde ich sagen du musst es so lösen, dass dein Charakter einen target waypoint hat, auf den er solange dieser nicht auf NULL zeigt zusteuert.
Wenn du jetzt den Waypoint wechseln willst musst du den target waypoint neu referenzieren, ergo
Code: [AUSKLAPPEN]
npc.target = NächsterWegpunkt()


lg
ComNik
WIP: Vorx.Engine

M0rgenstern

BeitragDo, Jun 10, 2010 8:06
Antworten mit Zitat
Benutzer-Profile anzeigen
ComNik:
Mein NPC HAT eine solche Funktion.

Undzwar diese hier:
BlitzMax: [AUSKLAPPEN]
Method GetNewGoal()
Local TmpGoal:Twaypoint
If Goal = Null Then
If (TWaypoint.tlAllWaypoints.FirstLink() <> Null) Then
Local TmpLink:TLink = TWaypoint.tlAllWaypoints.FirstLink()
If (tmplink.Value() <> Null) Then
Goal = tmplink.Value()
EndIf
EndIf
Else
If TWaypoint(Goal) Then TmpGoal = TWaypoint(Goal)
Goal = TmpGoal.Get_Follower()

EndIf
End Method


Ich habe schon versucht einen Destruktor in meine Waypoint Klasse einzufügen.
Das sieht dann so aus:

BlitzMax: [AUSKLAPPEN]
Method Destroy()
Self = Null
en Method


Ich bekomme dann immer eine Fehlermeldung die mir sagt, dass ich nur Variablen auf NULL setzen kann, das dort also nicht zugelassen ist.

Lg, M0rgenstern

Xeres

Moderator

BeitragDo, Jun 10, 2010 9:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Selbst wenn da mit Self ginge würde es nicht funktionieren, du musst das Objekt aus allen Listen und Globalen Variablen entfernen - dann gibt's keine Referenz mehr und es wird gelöscht.
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)

M0rgenstern

BeitragDo, Jun 10, 2010 14:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey.
Ich habs jetzt gelöst.
Danke für eure Hilfe.

Ich überprüfe einfach, ob der nachfolgende Wegpunkt NULL ist und wenn ja, dann geht er wieder an den Anfang.

Lg, M0rgenstern

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group