Objekte werden nicht wirklich gelöscht?
Übersicht

![]() |
M0rgensternBetreff: Objekte werden nicht wirklich gelöscht? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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() Und hier der Code wenn ein Wegpunkt gelöscht wird: BlitzMax: [AUSKLAPPEN] Method Destroy() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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-XBetreff: ...... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
ComNik:
Mein NPC HAT eine solche Funktion. Undzwar diese hier: BlitzMax: [AUSKLAPPEN] Method GetNewGoal() Ich habe schon versucht einen Destruktor in meine Waypoint Klasse einzufügen. Das sieht dann so aus: BlitzMax: [AUSKLAPPEN] Method Destroy() 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 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group