Mesh in Type löschen

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

romanski1985

Betreff: Mesh in Type löschen

BeitragMo, Dez 29, 2008 20:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hello!

Wie kann ich ein geladenes Mesh in einer meiner Types löschen? Oder von mir aus gleich das ganze Type? Gibt bestimmt schon Threads aber ich finde keins in dem jemand das Mesh so anlegt wie ich:

Type PthBox 'Mesh für Pathfinding

Field msh:Tmesh
Field x:Int
Field y:Int
Field z:Int
Field wall:Int

Function Neu:PthBox() ' Neues 3D-Objekt hinzufügen
Return New PthBox
End Function
End Type


und dann später im Code zum Beispiel:

Pthboxs[x]=Pthbox.Neu()
Pthboxs[x].msh = CreateCube()



Ist ein Teil von meiner Pathengine. Funktioniert auch alles so weit. Nur löschen kann ich sie nicht. kann mir vielleicht jemand weiterhelfen?

d-bug

BeitragMo, Dez 29, 2008 20:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Pthboxs[x].msh = Null
den Rest erledigt der Garbage Collector nehme ich an.

Ich nehme es nur an, da ich keinerlei Erfahrung mit miniB3D oder ähnlichen 3D Modulen habe. Aber im Normalfall braucht man nur alle Verknüpfungen der Instanz zu nullen die gelöscht werden soll.

Deine Funktion Neu irritiert mich allerdings ein wenig. Smile Würde doch reichen, wenn du: Code: [AUSKLAPPEN]
Pthboxs[x] = New Pthbox
machst.

tedy

BeitragMo, Dez 29, 2008 21:18
Antworten mit Zitat
Benutzer-Profile anzeigen
naja bei §d gibts ja nicht sowas wie Drawentity also denk ich mal es gibt ein Befehl Freeentity den musst du dann nutzen um erstmal das Mesh aus dem Speicher zu löschen da sonst dein Speicher irgendwann zu voll wird
einfach freeentity(msh) und dann löschst du aus deiner Liste (du hast da diesen array ) den Eintrag
01010100 01100101 01000100 01111001 00100000 00111010 01000100
 

klepto2

BeitragMo, Dez 29, 2008 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Benutze FreeEntity(Pthboxs[x].msh).

Am besten baust du in deinen Type eine Delete Method und machst dort sowas rein:

Code: [AUSKLAPPEN]

Method Delete()
         FreeEntity(msh)
End Method


Damit kannst du dann das machen was d-bug vorgeschlagen hat:

Pthboxs[x] = Null

Sobald der GC dann Pthboxs[x] löscht wird die Delete Methode aufgerufen und die Referenzen auf das mesh innerhalb der Engine werden gelöscht.
Matrix Screensaver
Console Modul für BlitzMax
KLPacker Modul für BlitzMax

HomePage : http://www.brsoftware.de.vu
 

romanski1985

BeitragDi, Dez 30, 2008 1:34
Antworten mit Zitat
Benutzer-Profile anzeigen
erstmal vielen dank für eure schnellen antworten!

da passiert leider garnichts wenn ich das reinschreibe. Weder wenn ich nur versuche mit freeentity das mesh zu löschen oder wenn ich die methode reinschreibe und dann den type auf null setze.

was mache ich falsch?

minib3d version 1.41

d-bug

BeitragDi, Dez 30, 2008 13:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hat sich da irgend etwas geändert? Meines Wissens war die Delete-Method doch nur als Platzhalter für zukünftige Erweiterungen von BMax vor reserviert. Kann aber durchaus sein, dass sich das in den letzten paar Updates irgendwo geändert hat. Ich gebe zu, dass auch ich zu faul bin alle Update-Historien zu lesen - von Readme's ganz zu schweigen *hust*.
 

klepto2

BeitragDi, Dez 30, 2008 14:02
Antworten mit Zitat
Benutzer-Profile anzeigen
ja d-bug, da hat sich was geändert, zumindest seit dem es den GC gibt und (ich weiß es nicht mehr) vielleicht auch davor schon.

Die Methode Delete ist wie die New Methode in jedem Objekt vorhanden und wird ausgeführt sobald keine Referenz mehr auf das Objekt existiert und der GC das Objekt freigibt.

@romanski1985:

Wenn du sehen willst ob es auch gelöscht wird kannst du die Delete Methode so erweitern:

Code: [AUSKLAPPEN]

Method Delete()
        Debuglog "Entitycount (before): " + TEntity.Entity_List.Count()
        Debuglog "freeing mesh!"
        FreeEntity msh
        Debuglog "Entitycount (after): " + TEntity.Entity_List.Count()
End Method


Im Debugmodus erhältst du dann etwas genauere angaben. Allerdings Achtung: bei verwendung der Delete Methode kann es passieren das nicht sofort das Objekt freigegeben wird. Der GC gibt Objekte nur frei wenn es sich lohnt, zb wenn eine gewisse Zeit verstrichen oder genug Objekte gelöscht wurden.
Matrix Screensaver
Console Modul für BlitzMax
KLPacker Modul für BlitzMax

HomePage : http://www.brsoftware.de.vu
 

romanski1985

BeitragDi, Dez 30, 2008 14:15
Antworten mit Zitat
Benutzer-Profile anzeigen
und wie sieht das aus mit ner liste die ich mit den types verknüpfe? vielleicht würde es damit funkionieren?

meine bmax version ist 1.12

ich hab gerade ausprobiert: normale meshes die nicht in types angelegt wurden kann ich mit freeentity() löschen. aber alles was sich in types befindet leider nicht. müsste ich dazu vielleicht den code direkt in der minib3d ändern? woran könnte das liegen?
 

romanski1985

BeitragDi, Dez 30, 2008 14:37
Antworten mit Zitat
Benutzer-Profile anzeigen
@klepto.

danke. gerade ausprobiert. das kommt raus:

DebugLog:Entitycount (before): 127
DebugLog:freeing mesh!
DebugLog:Entitycount (after): 126

allerdings unabhängig davon wie viele ich lösche(garkeine bis viele). ich lasse meine types(die ich gerade in "sppoints" umbenannt habe) so löschen:

sppoints[1] = Null
sppoints[2] = Null
 

klepto2

BeitragDi, Dez 30, 2008 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Du müsstest diese 3 Zeilen für jedes Objekt erhalten also bei 2 Objekten :

DebugLog:Entitycount (before): 127
DebugLog:freeing mesh!
DebugLog:Entitycount (after): 126

DebugLog:Entitycount (before): 126
DebugLog:freeing mesh!
DebugLog:Entitycount (after): 125

btw: Update mal dein BMax. Aktuelle version ist 1.30 und nicht 1.12 .
Dann solltest du das ganze nochmal testen, BMax ist in den Versionen um einiges effizienter geworden.
Matrix Screensaver
Console Modul für BlitzMax
KLPacker Modul für BlitzMax

HomePage : http://www.brsoftware.de.vu
 

romanski1985

BeitragDi, Dez 30, 2008 15:40
Antworten mit Zitat
Benutzer-Profile anzeigen
ich habe gerade geupdated. jetzt funktioniert aber mal wieder was anderes im code nicht weshalb ich es gerade nicht testen kann.

jetzt kommt Blitzmax und spuckt folgenden Fehler aus:

Unable to convert from 'TEntity' to 'int'

bei der zweiten Zeile von:


Global objektindex:Int = 0
objektindex = COLLISIONENTITY(camera,cc)

vorher hats aber funktioniert. warum muss das immer alles so kompliziert sein? Wink
 

romanski1985

Betreff: p.s.:

BeitragDi, Dez 30, 2008 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Ahhh.

Problem gelöst. Ich hatte ausversehen andauernd Waypoints generiert. Bin draufgekommen nachdem ich mich über die Hohe Anzahl von Entities im Debuglog gewundert habe.
Auf einmal läufts auch irgendwie viel schneller Wink


VIELEN DANK!

bis später-

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group