hello again!
Mir ist aufgefalle, dass der Memory Leak erst dann so extrem wird, wenn ein Spieler (Raumschiff) stirbt.
-> d.h. es liegt sehr wahrscheinlich doch nicht an den Netzwerkklassen, sondern daran, wie dieses Raumschiff gelöscht wird.
Ich poste mal eben wie es created und destructed wird, evtl. ist dort ein Fehler den ich nicht sehe:
Delphi-Quellcode:
TRaumschiffSprite = class( TMySprite )
public
nick: string;
farbe: TColor;
leben, lebenMax: Extended;
gesundheitsbalken: TBalken;
spielerid: integer;
constructor Create( AParent: TSprite ); override;
end;
procedure TSpriteVerwaltung.neuesRaumschiff( pID: Integer; pSpielerID: integer; pFarbe: TColor; pX, pY, pLaenge, pKurs: Integer; pVX, pVY, pAX, pAY, pLeben, pLebenMax: Extended );
// Erstellt ein neues Raumschiff, weist ihm die entsprechenden Eigentschaften zu
// und fügt es in die Liste ein
var
raumschiff: TRaumschiffSprite;
particle: TAdBillboardParticle;
begin
raumschiff := TRaumschiffSprite( getSprite( pID ) );
// es wird nur dann created, wenn das Raumschiff nicht bereits exisitiert.
//wenn es existiert werden nur unten die Werte wie x,y positiongeupdated etc.
if raumschiff = nil then begin
raumschiff := TRaumschiffsprite.Create( form1.AdSpriteEngine ); //hier wird das Raumschiff created
raumschiff.id := pID;
raumschiff.gesundheitsbalken := TBalken.Create( form1.AdSpriteEngine, 26, 3 );
Add( raumschiff );
end;
with raumschiff do begin
spielerid := pSpielerID;
farbe := pFarbe;
Angle := pKurs;
x := pX - Width / 2;
y := py - Height / 2;
vx := pVX;
vy := PVY;
ax := pAX;
ay := pAY;
color := farbe;
leben := pLeben;
lebenMax := pLebenMax;
gesundheitsbalken.x := x + 7;
gesundheitsbalken.y := y + 40;
gesundheitsbalken.Aktualisieren( lebenMax, leben, pVX, pVY, pAX, pAY ); // Lebensbalken aktualisieren (Breiten, v, a)
end;
end;
Nun zum interessanten Teil, dem Löschen:
Delphi-Quellcode:
function TBefehlLoeschen.Ausfuehren( pParameter:
string ): boolean;
var
lID: integer;
lSprite: TImageSpriteEx;
begin
try
//Sprite in der Liste suchen und das Listenobjekt löschen
lID := StrToInt( pParameter );
lSprite := Form1.SpriteVerwaltung.getSprite( lID );
Form1.SpriteVerwaltung.Remove( lSprite );
if lSprite
is TRaumschiffSprite
then
begin
TRaumschiffSprite( lSprite ).gesundheitsbalken.Free;
end;
//löschen des eigentlichen Sprites über Andorra
lSprite.dead;
result := true;
except
on E :
Exception do
ShowMessage(E.ClassName+'
error raised, with message : '+E.
Message);
result:=false;
end;
end;
Also wie gesagt, nach dem das erste mal ein Raumschiff zerstört wird, tritt dieser extreme Memory Leak auf.
Ist irgendwas mit meiner Löschen Methode falsch?
Wäre sehr nett, wenn Ihr mir nochmal weiterhelfen könntet
MfG