Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bewegung: Animation durch Off-Screens (https://www.delphipraxis.net/99817-bewegung-animation-durch-off-screens.html)

Jazzman 18. Sep 2007 10:21


Bewegung: Animation durch Off-Screens
 
Hallo Gemeinde,
ich suche seit längerem ein Tutorial o.ä. welches sich mit der Bewegungsdarstellung mit Hilfe von GDI -- also weder mit OpenGl, DelphiX etc, sondern nur mit Delphi "eigenen" Hausmitteln beschäftigt.

Mir ist vor allem folgendes nicht klar:

- Wenn ich DoubleBuffer := TRUE auf der entsprechenden Form sitzen habe, ist es dann überhaupt nötig mit OffScreens zu arbeiten? (Also, das Zeichnen im Speicher und dann das fertige Bild zeigen lassen).

- Was ist die schnellste Methode das Bild im Speicher auf ein sichtbares bmp zu kopieren: Ist es BitBlt -- und wenn ja, warum ist es bei mir so elend langsam (ich weiss, doofe Frage!)?

- Wie ist es mit der vertikalen Synchronisation VSYNCH mit dem Monitor? Also, wenn der Monitor links oben mit seinem Strahl ist, genau dann das Bild aus dem Speicher auf den Monitor kopieren? Notwendig, oder unnötiger Schnickschnack aus vergangenen Zeiten?

Wie gesagt, ein Tutorial, welches die Vor-und Nachteile bestimmter Vorgehensweisen darlegt. Wie machens es die Profis (ja, ich weiss sie nutzen DelphiX oder OpenGl -- aber es geht nicht um 3D oder super aufwendiges Rendering, sondern darum wie man nach allen Regeln der Kunst ein Rechteck über den Monitor bewegt.)

Sorry, ein Haufen Fragen, aber das ist mir z.Z. wirklich nicht ganz klar.

Vielen Dank vorab für Ideen/Kommentare/Links.
Schönen Gruß
Jazzman

SirThornberry 18. Sep 2007 10:37

Re: Bewegung: Animation durch Off-Screens
 
doubleBuffered ist eigentlich nur notwendig wenn du wirklich Komponenten wandern lässt. Dies hat allerdings den Nachteil das die Auslasung sehr hoch werden kann. Denn sobald du irgend eine Komponente (TImage etc.) bewegst wird sofort neu gezeichnet. Wenn du also 10 Dingen nacheinander bewegst (die Position änderst) wird 10 mal neu gezeichnet.

Um eine ordentliche Performance zu erreichen hab ich es bisher so gemacht:
- Eine Displaykomponente
- eine Bildkomponente (von TComponent abgeleitet)

Die Bildkoponenten haben das property Display wo die Displaykomponente zugewiesen werden kann.
Wenn sich das bild ändert (oder die Position) sagt diese Komponente einfach der Displaykomponente das diese sich neu zeichnen müsste (inklussive aller Bildkomponenten die sich darauf darstellen). Die Displaykomponente zeichnet jetzt aber nicht sofort alle Bildkomponenten sondern setzt einfach ein Flag das neu gezeichnet werden müsste.

Delphi-Quellcode:
procedure TDisplay.CheckRedrawTimer(Sender: TObject);
begin
  if (lastdraw + 40000 < GetTickCount()) and (fNeedRedraw) then
  begin
    lastdraw := GetTickCount();
    Invalidate();
  end;
end;
Wie man genau so etwas macht ist eben eine Sache des Programmierers. Programmieren heißt ja nicht einfach nur tippen sondern sich auch Gedanken zu machen wie man etwas am besten umsetzt.

mimi 19. Sep 2007 13:12

Re: Bewegung: Animation durch Off-Screens
 
Ich mache sowas z.z. alles in einer hintergrund TBitMap rein.
und zeichne nur das Neu was sich geändert hat.

So habe ich keine 100% CPU Auslastung sondern nur 2-10% oder so.

z.b. könnten alle 2D spiele nach dem gleichen verfahren gehen.

Auch Animationen sind leicht, habe ich zwar noch nie wirklich gemacht, aber dürften kein Problem sein mit bitbtl.
Musst dir halt nur eine Liste erstellen mit Position Angaben wo sich jede Grafik befindet und sie nach einander abspielen z.b. mit einem Timer !

SirThornberry 19. Sep 2007 13:13

Re: Bewegung: Animation durch Off-Screens
 
das von mir beschriebene arbeitet mit animationen. Dann kommt man aber meist nicht drumherum alles neu zu malen weil ja auch das neu gemalt werden muss wo die Figur vorher stand.

mimi 19. Sep 2007 13:19

Re: Bewegung: Animation durch Off-Screens
 
Ja das Speichere ich in einem 2 Buffer.
Da kommt der Hintergrund rein. Und ich zeichne jetzt bevor ich die Figur bewege den Teil neu, das hole ich mir aus dem 2. Buffer erst danach zeichne ich die Figur an der neuen Stelle.

Also ich zeichne bei mir nicht immer alle Grafiken mit samt den Hintergrund neu sondern nur das was ich gerade brauche im Prinzip könnte es auch bei mehren bewegten Grafiken klappen, da bin ich mir noch nicht ganz sicher.....


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 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