![]() |
[Andorra2D] Speicheraunutzung steigt bei ParticleSystem
Hallihallo.
Nun bin ich endgältig dem Andorra Wahn verfallen und bei meiner nachmittäglichen Programmierarbeit ist mir etwas aufgefallen: Jedesmal, wenn ich mit einem ParticleSystem einen Partikel erzeuge, steigt meine Speicherausnutzung um 10-70 KB (:!:). Liegt es an meinem Code, wenn Ja, ich finde den Fehler nicht. So nutze ich das System: Erzeugen:
Delphi-Quellcode:
Freieben sollte klar sein (BallHitPS.Free;).
BallHitPS:=TAdParticleSystem.Create(Form1.AdDraw1);
BallHitPS.Texture:=Form1.AdImageList1.Find(cBallHitParticleTextureName).Texture; BallHitPS.DefaultParticle.LoadFromFile(cBallHitParticleFile); Zeichnen:
Delphi-Quellcode:
Und hier steigt die Auslastung:
BallHitPS.Move(Form1.AdPerCounter.TimeGap / 1000);
BallHitPS.Draw(0,0);
Delphi-Quellcode:
Woran kann das liegen?
BallHitPS.CreateParticles(70,TAdParticle,aPoint.X, aPoint.Y);
Vielen Dank, Bääääär PS: Ich kann auch gerne das ganze Project anhängen, aber ich glaube, das nutzt nichts, weil die Speichernutzung NUR beim Erzeugen dieser Partikel steigt. |
Re: [Andorra2D] Speicheraunutzung steigt bei ParticleSystem
Soeben ist mir das auch noch bei einem "Erster-PartikelSystem-Versuch" - Projekt aufgefallen:
Hier steigt die Speicherauslastung demzufolge kontinuierlich.
Delphi-Quellcode:
Der bei den Demos liegende ParticleEditor scheint solche Probleme nicht zu kennen...
unit unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, AdDraws, AdClasses, ADparticles; type TForm1 = class(TForm) procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } public AdDraw1:TAdDraw; AdImageList1:TPictureCollection; partsys:TAdParticleSystem; AdPerCounter:TPerformanceCounter; procedure Idle(Sender:TObject;var Done:boolean); { Public-Deklarationen } end; var Form1: TForm1; xpos,ypos:integer; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin AdDraw1 := TAdDraw.Create(self); AdDraw1.DllName := 'AndorraDX93D.dll'; if AdDraw1.Initialize then begin AdPerCounter := TPerformanceCounter.Create; Application.OnIdle := Idle; AdImageList1 := TPictureCollection.Create(AdDraw1); with AdImageList1.Add('sprite') do begin Texture.LoadGraphicFromFile('sprite.bmp',true,clFuchsia); end; AdImageList1.Restore; partsys := TAdParticleSystem.Create(AdDraw1); partsys.Texture := AdImageList1.Items[0].Texture; partsys.DefaultParticle.LifeTime:=0.3; end else begin ShowMessage('Error while initializing Andorra 2D. Try to use another display'+ 'mode or another video adapter.'); halt; end; end; procedure TForm1.FormDestroy(Sender: TObject); begin AdImageList1.Free; AdPerCounter.Free; AdDraw1.Free; end; procedure TForm1.Idle(Sender: TObject; var Done: boolean); var i:integer; begin if AdDraw1.CanDraw then begin AdPerCounter.Calculate; Caption := 'FPS:'+inttostr(AdPerCounter.FPS); AdDraw1.ClearSurface(clblack); AdDraw1.BeginScene; partsys.CreateParticles(2,TAdParticle,xpos,ypos); PartSys.Move(AdPerCounter.TimeGap / 2000); partsys.Draw(0, 0); AdDraw1.EndScene; AdDraw1.Flip; end; Done := false; end; procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin xpos:=x-form1.left; ypos:=y-form1.top; end; end. [Edit] Der ParticleEditor nutz die Procedure PartSys.Dead, die, wie ich mal vermute, "ausgestorbene" Partikel entfernt. bei diesem Projekt klappt das sogar, mit ".Dead;" nach dem Zeichenvorgang klappts. Bei meinem eigentlichen Problem-Projekt leider nicht.[/Edit] [Edit] In dem selben Problem-Projekt befindet sich ein zweites PartikelSystem, welches ohne .Dead; den Speicher genauso füllt, wie das Erste. Im Vergleich zum Ersten hingegen macht es mit .Dead; keine Probleme mehr. Sehr eigenartig[/Edit] |
Re: [Andorra2D] Speicheraunutzung steigt bei ParticleSystem
:wall:
Ich suche nach dem Fehler! Danke für den Hinweis! |
Re: [Andorra2D] Speicheraunutzung steigt bei ParticleSystem
Moment: Mir ist eben noch was aufgefallen. BallHitPS erzeugt etwa alle 1,5 sek 70 Partikel. Eine gewisse Zeit lang steigt die Speicherausnutzung mit dem Erzeugen dieser 70 stück, dann bleibt sie etwa 0,5MB über der eigentlichen auslastung stehen. Immerhin steigt sie nicht noch weiter. Es kann also sein, dass die Partikel nur sehr lange existieren (nicht gelöscht werden), sie aber nicht mehr zu sehen sind. Ab dem Zeitpunkt, wo sie dann gelöscht werden, steigt die Speichernutzung logischerweise nicht mehr. Es muss also nicht zwangsläufig an deiner ParticleEngine liegen. Ich hoffe mal diese Variante ist die richtige... ^^
|
Re: [Andorra2D] Speicheraunutzung steigt bei ParticleSystem
Das gleich Problem habe ich denke ich auch bei mir. Umso läge ich spiele, umso unspielbarer werden die Framerates. Wenn ich anfangs 300fps habe habe ich nach 2 Spielen noch 20fps. Ich nutze bis zu 100 Sprites und für Explosionen 20-50 Partikel. Wenn mein Code von nöten ist werde ich ihn auch noch posten.
|
Re: [Andorra2D] Speicheraunutzung steigt bei ParticleSystem
In der "Simple-Particles" Demos kam die steigene Speicherauslastung nur, da ich (blöderweise), wie Bääääär schon festgestellt hat, das Dead vergessen habe. Mit Dead konnte ich keine steigende Speicherauslastung feststellen, ein Memory-Leak gibt es auch nicht. Falls sich bei jemanden von euch die Speicherauslastung trotz Dead drastisch erhöhen sollte, dann sagt mir bitte nochmal bescheid...
Nochmal Danke für den Hinweis, Andreas alias igel457 |
Re: [Andorra2D] Speicheraunutzung steigt bei ParticleSystem
Ich habe nach einer längeren Testphase weiter kein Speicherproblem festgestellt und gehe deswegen mal von der Idee in meinem letzten Post aus. Sollte sich was ändern, melde ich mich.
@igel457: Schreibe das Dead; und die Folgen, wenn man es vergisst bitte noch in die Tutorials auf der Andorra2D- Page und hier in der DP. ^^ Da steht es nämlich nicht drin, soweit ich weiß. :wink: |
Re: [Andorra2D] Speicheraunutzung steigt bei ParticleSystem
Gut, dass du mich an das "PartSys.Dead;" erinnerst.
[edit]Auf der Website steht es nun richtig, hier in der DP dauert es wohl noch ein bissl, weil ich die Beiträge in der Tutorialsektion nicht mehr bearbeiten kann (etwas suboptimal, wenn man mich fragt).[/edit] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz