Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Grafiken performant über Form bewegen (https://www.delphipraxis.net/36740-grafiken-performant-ueber-form-bewegen.html)

CalganX 24. Dez 2004 21:12


Grafiken performant über Form bewegen
 
Hi,
ich würde gerne vom Programm gesteuert einige Dinge über das Formular bewegen lassen. Soweit funktioniert das auch, allerdings ruckelt das Programm wie sonst was und frisst ordentlich CPU-Leistung. :(
Im Moment mache ich das mit einfachen TImages, die ich über das Formular bewege. Aber es flackert dabei extrem und frisst halt Leistung. Kann mir jemand kurz erklären, wie ich das Flackern wegbekomme (danke, aber DoubleBuffered kenne ich schon, das auf true setzen bewirkt erstmal nichts) und wie das etwas performanter (sprich mit weniger Leistungs-Fraß) geht?

Chris

dizzy 25. Dez 2004 02:01

Re: Grafiken performant über Form bewegen
 
Ich würde da keine Images nehmen, sondern einzelne Bitmaps, die du dann entsprechend verschoben auf ein Hintergrundbitmap zeichnest, und dieses dann OnPaint des Formulars auf dessen Canvas Zeichnest (BitBlt z.B.). Dann sollte es a) nicht flimmern, und b) evtl. etwas performanter sein.
Und noch was, was Punkt b) betrifft: Graphics32-Lib 8)

CalganX 25. Dez 2004 13:09

Re: Grafiken performant über Form bewegen
 
Hi,
die genannte Bibliothek ist schonmal genau das, was ich suche. :)
Aber kannst du deine Erklärung vielleicht mit ein wenig Source erläutern, irgendwie bin ich da noch nicht ganz durchgestiegen, wie du das meinst. :gruebel:

Chris

dizzy 25. Dez 2004 15:51

Re: Grafiken performant über Form bewegen
 
Im Grunde einfach alles was sich auf dem Formular bewegen soll im Vorfeld auf einem Bitmap zusammenkopieren, und das dann komplett auf's Form zeichnen.
Mal etwas Pseudocode (ich nehme an, dass die zu bewegenden Teile einzeln in Bitmaps vorliegen, und die Graphics32 mitspielt :)):
Delphi-Quellcode:
uses
  ..., GR32, ...;
.
.
.
var
  Sprites: array of TBitmap32; // mal angenommen für die zu bewegenden Teile...
.
.
.
procedure TForm1.OnPaint(...);
var
  BackBMP: TBitmap32;
begin
  BackBMP := TBitmap32.Create;
  BackBMP.SetSize(Form1.ClientWidth, Form1.ClientHeight);
  BackBMP.Clear(Color32(Form1.Color));

  Sprites[0].DrawTo(BackBMP, PosX1, PosY1);
  Sprites[1].DrawTo(BackBMP, PosX2, PosY2);
  .
  .

  BackBMP.DrawTo(Form1.Canvas.Handle);
  BackBMP.Free;
end;
Noch schneller dürfte es sein, wenn das BackBMP Member der Formklasse ist, so dass du es nicht jedes Mal neu instanziieren musst, sondern nur "Clear"-en.

Hoffe das hilft!
Grüzli,
Fabian


\\edit: Was da u.U. noch viel besser wäre, wäre ein TImage32 im Hintergrund auf deiner Form, und dann mit der "Layers"-Eigenschaft zu arbeiten. Das ist im ersten Moment etwas ungewohnt, aber die Hilfe zur G32 ist da echt nicht übel ;).
Das dürfte dann nochmals viiiiel Schneller sein, und im Endeffekt auch komfortabler!

\\edit2: @Chistian: Jupp genau das meinte ich mit dem ersten Edit 8)

Christian Seehase 25. Dez 2004 15:52

Re: Grafiken performant über Form bewegen
 
Moin Chris,

bei der Graphics 32 ist doch eine Sprite-Demo dabei.
Schau Dir die doch mal an.

CalganX 25. Dez 2004 16:30

Re: Grafiken performant über Form bewegen
 
Hi,
klasse. :firejump:
Die Demos habe ich mir angesehen, aber bei der Sprites-Demo hat wohl mein Gehirn ausgesetzt. Hängt vielleicht mit dem vielen ... Tee und O-Saft zusammen. :mrgreen:

Danke euch beiden, werde mir das mal zu Gemüte führen,
Chris

Oxmyx 26. Dez 2004 01:04

Re: Grafiken performant über Form bewegen
 
Ich hab das mal ganz einfach mit der BitBlt-Funktion der Winapi gelöst. Die ist sehr schnell, und sehr einfach anzuwenden.

CalganX 26. Dez 2004 11:20

Re: Grafiken performant über Form bewegen
 
Hi,
naja. Ich mache das jetzt mit der G32-Bibliothek. Das andere sieht mir zu anstregend aus. *g*

Ich habe mir jetzt die Sprites-Demo angesehen und bei das genaus gemacht, weil in der Demo, allerdings ist die CPU-Belastung bei 100 Layern bei gut 100%. Und angesichts der größe der einzelnen Layer ist das noch relativ wenig. :(
Bei der Sprites-Demo ist das aber genauso. Ich meine: zwar wird nichts anderes laufen, während mein Programm läuft, aber das kann schon einige Stunden laufen. Stört das nicht, wenn die CPU dann die ganze Zeit so ausgelastet ist?

Chris

dizzy 26. Dez 2004 12:32

Re: Grafiken performant über Form bewegen
 
Die sind eigentlich so gebaut, dass sie das locker flockig wegstecken. Wäre ja auch nen Dingen wenn nicht ^^


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 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-2025 by Thomas Breitkreuz