Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Eigene einfache 2D Grafik Engine (https://www.delphipraxis.net/78558-eigene-einfache-2d-grafik-engine.html)

Cöster 7. Okt 2006 10:34

Re: Eigene einfache 2D Grafik Engine
 
Naja, was soll deine Engine denn leisten? Nur, dass sie nicht direkt auf die PaintBox zeichnet, sondern erst auf ein Bitmap? Dafür brauchst du keine Engine

SirThornberry 7. Okt 2006 10:37

Re: Eigene einfache 2D Grafik Engine
 
Also ich hab mir vor kurzem (für meine Firma) eine recht performante Engine gebastelt die wie folgt funktioniert.

Ich habe eine Anzeigefläsche (Display) worauf später das fertige Bild kommt.
Wenn irgend ein Object neu gezeichnet werden muss teilt dieses Object dem Display mit das es neu gezeichnet werden müsste.
Das Display hat einen Timer in dem geprüft wird ob seit dem letzten malen 40ms vergangen sind und prüft ob überhaupt ein neuemalen erforderlich ist (ob also irgend ein Object das malen Flag gesetzt hat).
Nur wenn mindestens 40ms vergangen sind und das Malenflag gesetzt ist ruft das Display von allen Objekten die Malen-Methode auf und übergibt ein Bitmap worauf gemalt werden muss.
Wenn also kein Object ein neu malen braucht bleibt das Display auch unverändert und die cpu-last sinkt auf 0%.
Zusätzlich wird im Paint des Displays noch das Bitmap (worauf die Objecte gemalt haben) ausgegeben.
Auf diese Art und Weise habe ich locker über 100 Frames pro Sekunde geschaft (die 40ms heruntergesetzt zum test).

Das war jetzt nur grob umrissen wie man sowas machen kann. In meinem speziellen Fall sorgt das Display auch dafür das ebenen welche auf der Z-Achse weiter hinten leigen als erstes gemalt werden etc.

arbu man 7. Okt 2006 10:41

Re: Eigene einfache 2D Grafik Engine
 
Image32 ist auch noch ein bissel schneller, gab hier in Forum schon ein paar Anwenungen die das benutzt hattenund gut liefen :)

mfg, Björn

Cöster 7. Okt 2006 11:44

Re: Eigene einfache 2D Grafik Engine
 
Zitat:

Zitat von SirThornberry
Das Display hat einen Timer in dem geprüft wird ob seit dem letzten malen 40ms vergangen sind

Wie machst du denn so einen Timer? Nach Standard-Timer hört es sich nicht an und du hörst dich auch nicht gerade wie ein Fan von OnIdle an.

Zitat:

Zitat von SirThornberry
Auf diese Art und Weise habe ich locker über 100 Frames pro Sekunde geschaft (die 40ms heruntergesetzt zum test).

Hm? Versteh ich nicht. Wenn nur alle 40 ms was passiert kannst du doch keine 100 fps erhalten :?:

SirThornberry 7. Okt 2006 12:47

Re: Eigene einfache 2D Grafik Engine
 
[quote="Cöster"]
Zitat:

Zitat von SirThornberry
Zitat:

Zitat von SirThornberry
Auf diese Art und Weise habe ich locker über 100 Frames pro Sekunde geschaft (die 40ms heruntergesetzt zum test).

Hm? Versteh ich nicht. Wenn nur alle 40 ms was passiert kannst du doch keine 100 fps erhalten :?:

Deswegen hatte ich ja geschrieben
Zitat:

(die 40ms heruntergesetzt zum test)
Das Problem was die meisten haben ist das sobald sich ein Object ändert sie das Bild auf die Canvas ausgeben. Wenn man jetzt mehrere Objecte hat welche alle 40 ms ein neuzeischnen auslösen wird nicht alle 40 ms ein neue Zeischnen ausgelöst sondern jedes Object löst ein neu zeischnen aus was das ganze so langsam macht.
Es geht also nur darum das man die Ausgabe auf den Bildschirm aufs nötigste begrenzt und nicht bei jeder miniänderung gleich das gesammte Bild ändert.

Sunlight7 7. Okt 2006 13:08

Re: Eigene einfache 2D Grafik Engine
 
Zitat:

Zitat von ferby
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.

Das sieht nur so aus, als ob nur das Würmchen neu gezeichnet wird...
Da sich die CPU ohnehin so gelangweilt hat, war ich damals zu faul, da eine Optimierung einzubauen :???:

mimi 7. Okt 2006 13:09

Re: Eigene einfache 2D Grafik Engine
 
ich mache das so:
ich habe eine paintbox und eine liste alle objekte die ich zeichnen muss/möchte nun habe ich eine draw procedure die in zwei hälfe aufgeteilt ist:
isdraw auf drue wird alle komplet neu gezeichnet.

ist istDraw auf false wird nur noch das neugezeichet was sich geändert hat.

und ich verwende nur noch windows botschaften und habe dort eine zeitschleife eingebaut so habe ich es geschaft das die listbox die ich gezeichnet habe fast in "echtzeit" reagiert und das bei minimaler cpu auslastung*freu*.

atreju2oo0 7. Okt 2006 13:57

Re: Eigene einfache 2D Grafik Engine
 
Ansonsten ist es auch möglich mit der Scanline Eigenschaft zu arbeiten.
Da kriegst Du die Speicheradresse des Canvas Objektes und kannst dort direkt zeichnen.
Is meiner Erfahrung nach die schnellste Methode...

Sunlight7 7. Okt 2006 14:06

Re: Eigene einfache 2D Grafik Engine
 
Zitat:

Zitat von atreju2oo0
Ansonsten ist es auch möglich mit der Scanline Eigenschaft zu arbeiten.
Da kriegst Du die Speicheradresse des Canvas Objektes und kannst dort direkt zeichnen.
Is meiner Erfahrung nach die schnellste Methode...

Äh? Du meinst die Speicheradresse der DIB Bitmap.

ferby 12. Nov 2006 16:00

Re: Eigene einfache 2D Grafik Engine
 
Liste der Anhänge anzeigen (Anzahl: 3)
Hallo,

Also nach euren Antworten habe ich mich entschieden einfach mal meine eingene kleine Engine zu Basteln und schaun was rauskommt.

Das Ergebniss war super :-)


Die eigene Engine funktioniert ganz simpel:
Auf einen Bitmap wird im Hintergrund alles gemalt und dann wird alles auf eine PaintBox kopiert.

Ich habe euch alle 3 Versionen zum Testen bereitgestellt.

Achtung: Das Spiel Ferby-Speed Version 8 ist noch eine Alpha Version,
ich hab es nur zum Testen der Grafikengine raufgestellt, das Spiel selbst ist noch nicht fertig und kann noch Bugs haben.
Ich bitte nur um Kritik zur Grafik Leistung nicht zum Eigentlichen Spiel.


Version 8 Alpha 1:
Diese Version funktionirt mit Images, ohne Double Buffered

Version 8 Alpha 1.1
Diese Version funktioniert mit Images, mit Double Buffered

Version 8 Alpha 2
Diese Version funktioniert mit einen Bitmap und PaintBox


EDIT: Entzipt die Datei, öffnet die Exe, geht auf LEVEL LADEN, wählt Level 10. Da sieht man am besten den Unterschied.

Fazit:
Die eigene Engine hat sich gelohnt, fast kein Geschwindigkeitsverlust und die Grafiken ruckeln nicht mehr.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:55 Uhr.
Seite 2 von 3     12 3      

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