Wie entferne ich ein Type-Objekt aus dem Speicher?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Travis

Betreff: Wie entferne ich ein Type-Objekt aus dem Speicher?

BeitragSo, Sep 11, 2005 20:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Angenommen ich habe einen Type für irgendein Spielobjekt wie z.B. für die Gegner. Wie kann ich einen einzelnen Gegner löschen und den Speicher dafür wieder freimachen?

Erschlagt mich nicht, aber ich finde keine Lösung. Der Release-Befehl fordert immer eine Integer-Variable, wenn ich versuche das Objekt anzugeben.
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
 

Dreamora

BeitragSo, Sep 11, 2005 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Garnicht.
Sobald es keinen Verweis auf den Type mehr gibt, wird er beim nächsten Flushmem aufruf (das ohnehin in der Mainloop stehen muss) automatisch entsorgt.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

TheShadow

Moderator

BeitragSo, Sep 11, 2005 22:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mit Dreamora schon eine heisse Diskussion im engl. Forum.

Aber irg. sind nur wenige meiner Meinung.

Mann kann Type-Objekte nicht löschen. Das geht nur, wenn man alle Type-Variablen auf NULL setzt und FlushMem macht - dann erst... Vergisst man eine Type-Variable, dann wird es nicht gelöscht - und im schlimmsten Fall hat man weiterhin Zugriff über diese vergessene Variable darauf. Das erfordert mehr Konzentration bei der Programmierung als nötig.

Und dieser Weg ist meiner Meinung nach wie von einem anderen Universum - einfach nur unhandlich und wahhh... das macht die Programmierung mit Blitzmax "unschön"...

Einzige Lösung dafür wäre: ein Delete-Keyword, welches Type-Referenzen autom. auf Null setzt die auf einen Type-Eintrag linken - natürlich ohne selbst FlushMem auszulösen. Meiner Meinung ein hilfreicher Befehl. Selbst wenn der langsamer wäre, würde ich diesen benutzen - für schnellerern code macht man dann weiterhin "NULLs"...

Naja Mark hat es irg. nicht so mit Types drauf - bei alten BB's waren die Types global (ein großer Fehler). In BBmax hat man diesen Design-Fehler eliminiert und dafür einen ganz neuen eingeführt - kein Delete-Befehl... (wieder so ein Design-Fehler) bzw. "selbst-NULL-ierung" von Type-Referenzen ist nicht eingebaut - so wie es in alten BB's war. Das war meiner Meinung nach ein sehr geiles Feature

zu schade - irgendwann wird es sich wie ein Boomerang rächen, dass man sowas nicht früh genug implementierte... genau wie bei globalen Types in alten BB's.
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

regaa

BeitragMo, Sep 12, 2005 0:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Na dann warte mal hier auf Dreamoras Post Surprised .
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net

bruZard

BeitragMo, Sep 12, 2005 7:26
Antworten mit Zitat
Benutzer-Profile anzeigen
@TheShadow: Das ist geballter Unsinn. So wie es Dreamora beschrieben hat ist es korrekt. Auch ein myVar:MyType = Null erzwingt beim nächsten Flushmem ein Löschen. Einmal Flushmem in der Hauptschleife (nach Flip) genügt i.d.R. für den gesamten Code um keine Leaks zu produzieren.
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

Jolinah

BeitragMo, Sep 12, 2005 11:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Und wie schon einmal erwähnt haben Variablen einen Gültigkeitsbereich. Ist eine Variable nicht mehr gültig verschwindet sie sowieso und das nächste Flushmem löscht das Objekt auch wenn man nichts auf Null gesetzt hat.

Ausser natürlich man benutzt Globale Variablen, aber dann sind die ja auch aus irgend nem Grund Global, wäre mist wenn da die Objekte verschwinden würden Wink

Travis

BeitragDi, Sep 13, 2005 18:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für eure Hilfe. Ich habe es jetzt so gelöst, dass ich zuerst den Type aus der Liste entfernt habe und dann in der Hauptschleife FlushMem() angewendet habe.
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

Markus2

BeitragDi, Sep 13, 2005 18:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich mach das so ...

löschen geht dann mit TTriangle.Free X
wichtig ist das Var in der Freigabe Funk.

Code: [AUSKLAPPEN]

Type TTriangle

 'only for Triangle List and Ray Intersection

 Field V1:TV3D
 Field V2:TV3D
 Field V3:TV3D

 Function Create:TTriangle(V1:TV3D,V2:TV3D,V3:TV3D)
  Local T:TTriangle=New TTriangle
  T.V1=V1
  T.V2=V2
  T.V3=V3
  Return T
 End Function

 Function Free(T:TTriangle Var)
  T.V1=Null
  T.V2=Null
  T.V3=Null
  T=Null
 End Function
 
End Type

Jolinah

BeitragMi, Sep 14, 2005 0:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist eigentlich ne gute Lösung Smile aber auch da besteht leider noch das Problem dass man für jede Variable Free aufrufen muss wenn man z.B. zwei Variablen hat die auf das selbe Objekt zeigen.

PS: T.V1 = Null usw. wäre nicht nötig. Indem man T = Null setzt werden auch die Eigenschaften auf Null gesetzt, bzw. der Referenzzähler wird um 1 verkleinert.

rema

BeitragMi, Sep 14, 2005 6:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Eigentlich ist dies überfüssig alle Variabeln auf NULL zu setzen. Nur einfach den Type auf NULL setzten und auch nicht vergessen den Type aus der TList zu löschen, fals eine vorhanden ist.

' erstellen
mylist = new LList
mytype:TType = new TType
mylist.addlast mytype

' löschen
mylist.remove(mytype)
mytype = Null

Du kannst dies ja in einem Test mal mit MemAlloced() testen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group