Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [Andorra2D] Speicheraunutzung steigt bei ParticleSystem (https://www.delphipraxis.net/90445-%5Bandorra2d%5D-speicheraunutzung-steigt-bei-particlesystem.html)

Bääääär 17. Apr 2007 16:47


[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:
BallHitPS:=TAdParticleSystem.Create(Form1.AdDraw1);
BallHitPS.Texture:=Form1.AdImageList1.Find(cBallHitParticleTextureName).Texture;
BallHitPS.DefaultParticle.LoadFromFile(cBallHitParticleFile);
Freieben sollte klar sein (BallHitPS.Free;).

Zeichnen:
Delphi-Quellcode:
BallHitPS.Move(Form1.AdPerCounter.TimeGap / 1000);
BallHitPS.Draw(0,0);
Und hier steigt die Auslastung:
Delphi-Quellcode:
BallHitPS.CreateParticles(70,TAdParticle,aPoint.X, aPoint.Y);
Woran kann das liegen?

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.

Bääääär 17. Apr 2007 16:58

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:
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.
Der bei den Demos liegende ParticleEditor scheint solche Probleme nicht zu kennen...

[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]

igel457 17. Apr 2007 17:31

Re: [Andorra2D] Speicheraunutzung steigt bei ParticleSystem
 
:wall:

Ich suche nach dem Fehler! Danke für den Hinweis!

Bääääär 17. Apr 2007 17:45

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... ^^

g0rmed 18. Apr 2007 09:26

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.

igel457 18. Apr 2007 16:46

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

Bääääär 18. Apr 2007 18:26

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:

igel457 18. Apr 2007 18:34

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 14:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz