Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi 8Bit Game Engine (https://www.delphipraxis.net/178494-8bit-game-engine.html)

milos 11. Jan 2014 04:18

8Bit Game Engine
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo DPler ;)

Ich habe mich nach einer kurzen Planung mal an den versuch gemacht meine eigene kleine 8Bit Game Engine zu programmieren.
Um zu zeichnen benutze ich vorerst Direct2D. Wenn ich mich jedoch genug in die Materie einer Game Engine eingearbeitet habe, werde ich wohl auf Lazarus und OpenGL zurückgreifen, da multiplatform :)

Ich habe schon etwas kleines hingekriegt und zwar habe ich mehrere Klassen erstellt die ich später für das Spiel brauchen werde wie Gameobjekte, Sprites usw. jedoch sind sie nicht ausgereift und 100% abgeschlossen.

Ich habe nun einige Fragen, zu Sachen, bei denen ich mir nicht sicher bin wie ich sie lösen sollte.

Mein grösstes Problem ist wohl die Game-Loop.
Wie soll ich diese entwickeln? Momentan habe ich einfach eine while Runtime.IsRunning do loop genommen und es funktioniert auch, jedoch denke ich, dass es dafür bessere Lösungen gibt oder etwa nicht?

Die Performance ist auch nicht gerade die beste. Als Test habe ich 128x72 gerendert und auf 1280x720 gestreckt und bekomme ca. nur 20 FPS mit der while schleife. Habe auch Timer versucht, jedoch sind diese bei zu niedrigen Intervallen buggy.

Ab und zu (vorallem wenn man viel mit der Fenstergrösse spielt) kommen Exceptions aber leider, kann ich mit diesen nicht wirklich was anfangen. Beim debuggen kommen aber die Exceptions komischerweise selten bis nie.

Wie kann ich am besten die FPS zählen? Die generierungszeit eines Frames nehmen und auf eine Sekunde rechnen oder doch lieber die Frames zählen?

Ich wäre froh wenn sich mal einer den Code anschauen könnte, und mir sagen könnte was es zu verbessern gibt und wenn einer ne Lösung für eins meiner Probleme hätte wäre ich auch sehr dankbar dafür. :D Wie gesagt, bin totaler neuling in dem gebiet :)

Im Anhang ist der Source Code und das Kompilat zu finden. Der Fenstertitel ist die Frameanzahl die seit start gezeichnet wurden. Die Runtime kann man bisher nur mit Escape beenden.

Ich bedanke mich schon mal im vorraus für nützliche tipps :)

MfG

Edit: Ach ja der Code ist hässlich, aber ich kenne ihn wengistens ziemlich gut, auch wenn ds projekt nicht gerade gross ist ^^

Sir Rufo 11. Jan 2014 05:43

AW: 8Bit Game Engine
 
Schau dir mal das hier an

http://smartmobilestudio.com/Smartde...and/index.html

http://showcases.smartmobilestudio.c...ssile-command/

Den Quelltext gibt es auch. Der ist zwar in DWScript aber passt fast 1:1 auf Delphi.
Zudem geht es dir ja auch um die Game-Loop und dafür ist das ein gutes Beispiel.

Medium 11. Jan 2014 13:47

AW: 8Bit Game Engine
 
Die meisten Game-Loops haben, zumindest ganz aussen drum rum, in etwa diesen Aufbau:
Delphi-Quellcode:
while true do
begin
  HandleUserInputs;
  ModifyWorldAccordingToInputsAndMechanics;
  DrawNextFrame;
  ShowFrame;
end;
Um die FPS zu zählen bietet es sich eher an die geschafften Frames in einer gewissen Zeitspanne zu zählen und auf eine Sekunde umzurechnen, da die Timer sonst dafür etwas ungenau werden können.

Deine geringe Framerate würde ich weniger auf die verwendete Schleifenart noch auf Direct2D zurück führen. Ich vermute eher stark, dass deine eigentlichen Zeichenvorgänge da die Schhuldigen sind. (Die Art der Schleife macht praktisch gar keinen Unterschied - so lange man Timer mal aussen vor lässt, die dort eh nichts zu suchen haben, und D2D ist für sich genommen durchaus in der Lage dazu viele FPS zu zaubern.)

milos 11. Jan 2014 16:07

AW: 8Bit Game Engine
 
Ok, danke für die hilfreichen antworten :)

Werde mir das spiel mal genauer ansehen, ist echt interessant interessant was der gemacht hat :D

Werde mir auch mal meinen source genauer ansehen, vielleicht kriege ich die performance ja etwas verbessert ^^

MfG

Mavarik 11. Jan 2014 16:54

AW: 8Bit Game Engine
 
Habe ich was übersehen? Was ist eine 8Bit Engine ?

Sir Rufo 11. Jan 2014 16:56

AW: 8Bit Game Engine
 
Zitat:

Zitat von Mavarik (Beitrag 1243186)
Habe ich was übersehen? Was ist eine 8Bit Engine ?

Wer verliert muss sich besaufen :cheers:

Mavarik 11. Jan 2014 16:58

AW: 8Bit Game Engine
 
Zitat:

Zitat von Sir Rufo (Beitrag 1243187)
Zitat:

Zitat von Mavarik (Beitrag 1243186)
Habe ich was übersehen? Was ist eine 8Bit Engine ?

Wer verliert muss sich besaufen :cheers:

Sorry für mich nur Bit-Drive ich muss noch fahren.

Sir Rufo 11. Jan 2014 17:06

AW: 8Bit Game Engine
 
Zitat:

Zitat von Mavarik (Beitrag 1243188)
Zitat:

Zitat von Sir Rufo (Beitrag 1243187)
Zitat:

Zitat von Mavarik (Beitrag 1243186)
Habe ich was übersehen? Was ist eine 8Bit Engine ?

Wer verliert muss sich besaufen :cheers:

Sorry für mich nur Bit-Drive ich muss noch fahren.

Hoffentlich nicht auch Bit-Drive (aus oder Vollgas) :mrgreen:

Aphton 11. Jan 2014 17:45

AW: 8Bit Game Engine
 
8Bit Engine.. auch unter dem Namen 1Byte Engine bekannt..

milos 11. Jan 2014 18:11

AW: 8Bit Game Engine
 
Wikipedia

Mein Ziel ist es halt eine (8Bit) Game Engine zu basteln mit der man ganz einfach so eine Grafik hinbekommt wie früher zu NES Zeiten. Es gibt immer noch Spiele die trotz so einer Grafik sehr bekannt geworden sind. z.B. ist zur Zeit Startbound in ziemlich grosser Titel.

MfG

Edit: Wollte noch erwähnen, dass ich bisher schon einige Sachen gefixt habe und in der Version die ich hier hochgeladen habe ist noch ein Fehler drin, der den Speicherbedarf auf über 1GB schiesst und das Programm dann anschliessend abstürzt. Ist mittlerweile aber behoben

Sir Rufo 11. Jan 2014 18:55

AW: 8Bit Game Engine
 
Sägst du dafür was von der CPU ab? :mrgreen:

milos 11. Jan 2014 19:15

AW: 8Bit Game Engine
 
Könnte man meinen, wenn man bedenkt das die NES mit 256x240 soweit ich weiss 50 FPS rendern konnte und die Engine es nicht mal mit 128x72 auf 30 schafft :D

jaenicke 11. Jan 2014 21:07

AW: 8Bit Game Engine
 
Die vielen Aufrufe von FillRect machen das ganze natürlich nicht gerade schnell.

Zudem müssen bei der gewählten Vorgehensweise jedes Mal beim Zeichnen die Zeichenobjekte neu erstellt werden. Ich würde hier eher die zweite Variante aus der Dokumentation wählen, das sollte schneller sein:
http://docwiki.embarcadero.com/RADSt...henfl%C3%A4che

Außerdem ist Antialiasing standardmäßig an, wird hier aber gar nicht benötigt. Das zu deaktivieren sollte das ganze mehr als doppelt so schnell machen, je nach Grafikkarte. Dafür reicht vor dem BeginDraw:
Delphi-Quellcode:
  Drawer.Canvas.RenderTarget.SetAntialiasMode(D2D1_ANTIALIAS_MODE_ALIASED);
...

milos 12. Jan 2014 00:59

AW: 8Bit Game Engine
 
Hi,

danke für die Antwort. Der Tipp mit dem Antialiasing hat die Perforamnce wirklich um fast das doppelte gesteigert :)

Meinst du mit der 2. Variante, den Bereich in "Exklusive Verwendung der Direct2D-Zeichenfläche"?
Weil mein Code funktioniert so wie der Code in der 2. Codebox in der Dokumentation.

MfG

Popov 12. Jan 2014 02:13

AW: 8Bit Game Engine
 
@milos

Ich hab früher für den C64 etliche Games programmiert. Wenn du ein Engine in der Richtung programmieren willst, dann mach es nicht zu gut. Laß es einfach sein. Auf der anderen Seite auch nicht zu einfach. Es hat keinen Grund die billigen Grafik von damals zu simulieren. Was aber - um mal bei dem C64 zu bleiben - der C64'er besonderes hatte, das waren Sprites. Das war der Unterschied. Man musste sich nicht einen abmühen und um Dublebuffer kümmern um paar Objekte auf dem Bildschirm zu bewegen, man hat dem Sprite ein Bild zugewiesen und musste ihn nur noch auf dem Bildschirm bewegen. Und wenn sich zwei berührten, gab es eine Info.

Mehr hatten die alten Kisten nicht drauf. Der Rest war das Können der Programmierer.

jaenicke 12. Jan 2014 07:11

AW: 8Bit Game Engine
 
Zitat:

Zitat von milos (Beitrag 1243229)
Meinst du mit der 2. Variante, den Bereich in "Exklusive Verwendung der Direct2D-Zeichenfläche"?
Weil mein Code funktioniert so wie der Code in der 2. Codebox in der Dokumentation.

Dann müsstest du den Code einmal zeigen, denn der oben angehängte erzeugt den TDirect2DCanvas im Paint jedes Mal neu. (Und das ist die erste Variante.)

milos 12. Jan 2014 09:28

AW: 8Bit Game Engine
 
@Popov: An Sprites habe ich auch schon gedacht, werde ich aber erst implementieren sobald sich die Performance (stark) verbessert hat. Bin mittlerweile bei ca 45FPS mit einer Auflösung von 128x72, was nicht gerade viel ist ^^

@jaenicke: Ahh du meintest wohl doch den 3. Codeteil. Habe es mal verucht so einzubauen, jedoch habe ich probleme funktionen wie WMPaint und WMSize von einem anderen Objekt aus meiner Form zuzuweisen. Geht das überhaupt, oder muss ich dies direkt in der Form klasse tun?

MfG

TiGü 13. Jan 2014 11:16

AW: 8Bit Game Engine
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von milos (Beitrag 1243241)
@jaenicke: Ahh du meintest wohl doch den 3. Codeteil. Habe es mal verucht so einzubauen, jedoch habe ich probleme funktionen wie WMPaint und WMSize von einem anderen Objekt aus meiner Form zuzuweisen. Geht das überhaupt, oder muss ich dies direkt in der Form klasse tun?

Ich habe mal mit deinen Code herumgespielt und ein bisschen refaktorisiert.
Eine Möglichkeit auf WMPaint und WMSize zu reagieren siehst du im Anhang.

milos 14. Jan 2014 00:46

AW: 8Bit Game Engine
 
Cool, vielen dank :)

Hat mir nun das Prinzip der 2. Methode erklärt :D

Edit: Wie ich sehe, hast du die Qualität des Codes auch noch verbessert. Vielen dank dafür ;)


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