AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Eigene einfache 2D Grafik Engine
Thema durchsuchen
Ansicht
Themen-Optionen

Eigene einfache 2D Grafik Engine

Ein Thema von ferby · begonnen am 7. Okt 2006 · letzter Beitrag vom 15. Nov 2006
Antwort Antwort
Seite 1 von 3  1 23      
ferby

Registriert seit: 15. Aug 2004
Ort: Wien
841 Beiträge
 
Delphi 2010 Enterprise
 
#1

Eigene einfache 2D Grafik Engine

  Alt 7. Okt 2006, 00:01
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
 BitBlt(paintbox1.Canvas.Handle, 0, 0, bm.Width, bm.Height, bm.Canvas.Handle, 0, 0, SrcCopy); bring ich es dann auf ein TPaintBox.

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.
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#2

Re: Eigene einfache 2D Grafik Engine

  Alt 7. Okt 2006, 00:20
Hallo,
Zitat von ferby:
Hat meine Engine, so wie ich sie mir vorstelle, überhaupt einen Sinn?
Nein, siehe nächste Frage.
Zitat von ferby:
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?
Wie Du schon sagtest, DoubleBuffered macht genau das gleiche, nur mit geringfügig weniger Overhead.

Ä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
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Eigene einfache 2D Grafik Engine

  Alt 7. Okt 2006, 00:24
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.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Eigene einfache 2D Grafik Engine

  Alt 7. Okt 2006, 00:32
Imho nimmt man ab 16 bildern pro sekunde schon eine bewegung wahr.

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.
  Mit Zitat antworten Zitat
ferby

Registriert seit: 15. Aug 2004
Ort: Wien
841 Beiträge
 
Delphi 2010 Enterprise
 
#5

Re: Eigene einfache 2D Grafik Engine

  Alt 7. Okt 2006, 00:40
Hi,

Phuuu, verschiedene Antworten, verschiedene Vorschläge.



Zitat:
Das sind gerade mal 20 Bilder pro Sekunde.
Glaub mir für das spiel was ich mache reicht es. Du kannst mein Spiel mit Nokia Snake vergleichen,
bei solchen Spielen reichen 20 Bilder die Sekunde locker.


Zitat:
Ändern sich denn immer alle Images?
Nein nicht alles, aber sehr viel.
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.
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Eigene einfache 2D Grafik Engine

  Alt 7. Okt 2006, 01:04
Zitat von NamenLozer:
Imho nimmt man ab 16 bildern pro sekunde schon eine bewegung wahr.
Natürlich, man sollte auch bei einem Bild pro Sekunde eine Bewegung wahrnehmen, sonst ist man ja blind. Es kommt nur darauf an, wann es ruckelt und wann nicht.


Zitat von ferby:
Glaub mir für das spiel was ich mache reicht es. Du kannst mein Spiel mit Nokia Snake vergleichen,
bei solchen Spielen reichen 20 Bilder die Sekunde locker.
Nagut

Zitat von ferby:
Ich hoff es hat jemand noch eine richtig guten Vorschlag der mich dazu bringt die Engine einfach zu schreiben oder das ganze zu lassen.
Kannst ja erstmal das mit den 50 Bitmaps im Speicher versuchen, sodass du die Images freigeben kannst. Wirst dann ja sehen, in wie weit Verbesserungen dann noch nötig sind.
  Mit Zitat antworten Zitat
ferby

Registriert seit: 15. Aug 2004
Ort: Wien
841 Beiträge
 
Delphi 2010 Enterprise
 
#7

Re: Eigene einfache 2D Grafik Engine

  Alt 7. Okt 2006, 01:08
Hallo,

Zitat:
Kannst ja erstmal das mit den 50 Bitmaps im Speicher versuchen
Wiso 50? Ich brauche nur ein Bitmap, auf den 50 Objekte gezeichnet werden^^



Zitat:
Wirst dann ja sehen, in wie weit Verbesserungen dann noch nötig sind.

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.....
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Eigene einfache 2D Grafik Engine

  Alt 7. Okt 2006, 02:22
Zitat von ferby:
Hallo,

Zitat:
Kannst ja erstmal das mit den 50 Bitmaps im Speicher versuchen
Wiso 50? Ich brauche nur ein Bitmap, auf den 50 Objekte gezeichnet werden^^
Ja, statt der 50 Images auf der Form hast du dann 50 Bitmaps im Speicher. Also insgesamt 51 Bitmaps im Speicher. Es ist sicher schneller, von den 50 Bitmaps im Speicher auf das 51te zu kopieren als 50 mal Image1.Picture.Bitmap auf ein Bitmap im Speicher zu kopieren. Nachdem du die Bitmaps der 50 Images im Speicher hast solltest du für jedes Image nochmal Free aufrufen, um den Speicher etwas zu entlehren.
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#9

Re: Eigene einfache 2D Grafik Engine

  Alt 7. Okt 2006, 06:52
Moin ferby!

Wenn ich das richtig verstehe, und Du so etwas das hier programmieren möchtest, muß es nicht DirectX sein.
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.
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
ferby

Registriert seit: 15. Aug 2004
Ort: Wien
841 Beiträge
 
Delphi 2010 Enterprise
 
#10

Re: Eigene einfache 2D Grafik Engine

  Alt 7. Okt 2006, 11:26
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:14 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