![]() |
Eigene einfache 2D Grafik Engine
Hallo
Ich habe ein Problem mit Grafiken. Ich programmiere gerade ein Spiel bei den auf der ganzen Form ständig bis zu 50 Images bewegt und vergrößer/verkleinert werden. Leider geht das nicht ruckelfrei. Ich habe schon mehrmals gelesen das TImage einfach nicht dafür gedacht ist, deshalb möchte ich mir jetzt selbst eine ganz einfache Engine schreiben. Delphix und andere Engines hab ich schon ausprobiert, die sind aber zu komplex, bzw. zu aufwendig für meine Programme. Vor allem möchte ich die Engine selbst schreiben. Mein Ansatz ist simple: Ich zeichne die 50 Objekte, die alle Rechtecke sind und meist einfärbig, auf einen TBitmap und mit
Delphi-Quellcode:
bring ich es dann auf ein TPaintBox.
BitBlt(paintbox1.Canvas.Handle, 0, 0, bm.Width, bm.Height, bm.Canvas.Handle, 0, 0, SrcCopy);
Die Paintbox wird dann alle 50ms neu gezeichnet. Jetzt meine eigentlich Frage: Wenn ich bei meiner jetztigen Programmierung, bei dder ich 50 TImages verwende, doublebufferd auf true stelle, dann ruckelt zwar nichts mehr, nur es wird alles um ca. das 10 Fache verlangsamt und die CPU springt sofort auf 100%. Doublebufferd mach aber genau das selbe was ich machen will: Es zeichnet intern auf ein Bitmap und bringt es dann auf einmal auf die Form. Daher frage ich nun: Hat meine Engine, so wie ich sie mir vorstelle, überhaupt einen Sinn? Ist da ein Unterschied wen ich alle Objekte auf ein TBitmap Zeichne und dann auf eine PaintBox kopiere, oder ob ich 50 Images habe und mit DoubleBufferd auf ein TBitmap intern zeichnen lasse? Kann mich wer aufklären??? Bin auch dankbar für Ideen für die Engine, sollt hal sehr einfach sein. |
Re: Eigene einfache 2D Grafik Engine
Hallo,
Zitat:
Zitat:
Ändern sich denn immer alle Images? Wenn sich immer nur Teile ändern, dann kannst Du Windows mitteilen, auch nur diese Bereiche neu zu zeichnen. Dadurch lassen sich Performanceverbesserungen erreichen, die geradezu obszön sind. Das eigentliche Problem ist aber: Du möchtest eine Framerate von 20 fps erreichen, dafür aber das GDI verwenden. Leider ist dieses nicht für so etwas ausgelegt. Genau dafür wurde DirectX (damals noch WinG) entwickelt. Wenn Du also flackerfreie grafikintensive Programme schreiben willst, rate ich Dir dringend zu einer hardwarebeschleunigten Graphikschnittstelle (DirectX/OpenGl). Gruß xaromz |
Re: Eigene einfache 2D Grafik Engine
Ich weiß nicht, ob es was hilft, aber du könntest es ja mal versuchen:
Gar keine Images benutzen! Die Bitmaps, die sich unter den Images verbergen könntest du in Variablen im Hauptspeicher einlesen, um die Images nachher freigeben zu können. Ein Bitmap im Speicher braucht sicherlich weniger Platz als ein Image auf der Form und der Zugriff ist auch schneller. Dann kopierst du diese Bitmaps einfach mit BitBlt, wie du's beschrieben hast auf die PaintBox. PS: Ein Timer-Intervall von 50 halte ich für zu langsam. Das sind gerade mal 20 Bilder pro Sekunde. Das menschliche Auge hat eine Reaktionszeit von einer 50tel Sekunde. Lieber ein 20er-Intervall. |
Re: Eigene einfache 2D Grafik Engine
Imho nimmt man ab 16 bildern pro sekunde schon eine bewegung wahr. :gruebel:
Auf jeden Fall sollte BitBlt schneller sein als tausend images. Einen Versuch wäre es also Wert. Ich würde aber für das Intervall keinen Timer nehmen, weil der sehr Ungenau ist und je nach Rechner/Betriebssystem unterschiedlich schnell laufen kann. Besser wäre eine Schleife mit selbstgebastelten Delays. |
Re: Eigene einfache 2D Grafik Engine
Hi,
Phuuu, verschiedene Antworten, verschiedene Vorschläge. Zitat:
bei solchen Spielen reichen 20 Bilder die Sekunde locker. Zitat:
Nur ich glaub das wird mir dann schon wieder zu viel Aufwand, immer die Berieche zu suchen die neu gezeichnet werden sollen, ich will das ganze so einfach und leicht wie möglich halten.... Ich hoff es hat jemand noch eine richtig guten Vorschlag der mich dazu bringt die Engine einfach zu schreiben oder das ganze zu lassen. |
Re: Eigene einfache 2D Grafik Engine
Zitat:
Zitat:
Zitat:
|
Re: Eigene einfache 2D Grafik Engine
Hallo,
Zitat:
Zitat:
Ich hoffe ja das mir jemand aus der Delphi-Praxis sagen kann ob meine Idee ein schwachsinn ist oder ob sie zimlich sicher bessere Performance bringt als mit DoubleBuffered..... |
Re: Eigene einfache 2D Grafik Engine
Zitat:
|
Re: Eigene einfache 2D Grafik Engine
Moin ferby!
Wenn ich das richtig verstehe, und Du so etwas ![]() In der schnellsten Stufe (Turbo, 10 KM/H) läuft mein Spiel mit 20 fps und die CPU langweilt sich dabei sowas von zwischen 0 und 3 Prozent bei 2.40 Ghz. Wenn Du jetzt nicht die größten ansprüche auf die Framerate stellst, für 20 fps reicht GDI. |
Re: Eigene einfache 2D Grafik Engine
Hallo,
eigentlich sollte das reichen, der große Unterschied bei meinen Spiel ist es, das sich nicht nur die Spielfigur bewegt (also bei dir der Wurm), sondern auch das Spielfeld. Ich werde mir einfach mal eine Engine basteln und dann hier rein posten ob es schneller ist oder ob es für die Katz war. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:16 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