VB 2005: Ebenen für GDI+

Luke499

Grünschnabel
Ich bin gerade dabeit ein Spiel mit GDI+ zu machen. (Andere Grafikmethoden krieg ich im mom. nicht gebacken)
Dieses läuft in Echtzeit ab, d.h. es muss dauernd aktualisiert werden. Doch umsomehr Objekte ich benutze, umso mehr stockt das ganze.
Nur die meisten Objekte verändernsich im Laufe des Spieles nicht / nur ein paar mal, werden aber trotzdem bei jeder aktion neugezeichnet.
Da sind wir auch schon an meinem Problen angelangt:
Kann ich mit GDI+ mehrere Zeichenebenen machen? Also als ob ich mehrere panels übereinander legen würde, und in jedes mit gdi+ zeichnen würde, und dann halt nur die aktualisiere, in der sich wirklich was geändert hat?
 
Du kannst dich hier mit Transparenzen spielen, vielleicht hilft dir das was (mehrere Panels verwenden, diese transparent setzen). Grundlegend würde ich aber meinen, dass GDI+ hier eventuell nicht die ganz richtige Wahl ist ... vor allem wenn du ein Echtzeit-Spiel entwickeln willst. Hier solltest du dich dann doch in DirectX einlesen.
 
Hallo zusammen

Mehrere Ebenen kannst du machen, indem du hintereinander zeichnestt, oder wie Norbert geschrieben hat, mit Transparenz.
Was für ein Spiel soll denn das mal werden?

Sobald es etwas komplexer wird, vorallem bei Echtzeit, kommt man mit GDI+ schnell an die Grenzen, das musste ich am eigenen Leibe erleben :))
Man kann den Code zwar "optimieren", jedoch wird das schnell relativ kompliziert und unleserlich. Die resultierende Performance rechtfertigt das auch niemals.

Ich würde dir empfehlen, dich in DirectX einzulesen, es lohnt sich.
Am Anfang ist es zwar relativ komplex, jedoch hat man im 2D Bereich trotzdem schnell was zusammen.
Also alles was über ein Bomberman oä. herausgeht, sollte man m.E. nicht mehr mit GDI+ machen.


Gruss Peter
 
Ich habe auch das Problem, mit mehreren Ebenen.

Ich habe ein Panel, auf dem ich einen zeitlichen Verlauf darstellen möchte.
Also grundlegen einmal Beschriftungen und dergleichen, die sich nicht (häufig) ändern.

Nun möchte ich einen Zeitstrahl einfügen, der sich sekündlich darüber bewegt...

Wie könnte ich das realisieren?

Wenn ich alles neu zeichne, wirkt sich das irrsinnig auf die Performance auf und ist eigentlich nicht notwendig.

Ich habe bereits versucht, bei jedem Timer_Tick Event von einer Sekunde ein neues Graphics Object zu erstellen, in dem ich den Strahl und die Zeit als Text reinzeichne.
Jedoch ist das deshalb ein Problem, da ich den vorigen Strahl nicht lösche, dieser immer größer wird und irgendwann einmal den kompletten Bildschirm ausfüllt, wenn ich die komplette Form nicht aktualisiere.
Mit der Methode "Clear" kann ich das Graphics Object nicht wirklich löschen, lediglich mit einer Farbe ausfülllen... Das Problem ist nun, dass das hinterliegende Bild nicht einfärbig ist, und ich die momentane Farbe nicht kenne.

Habe auch schon versucht, mit "Color::Transparent" bezw. "Empty" zu arbeiten,
aber dann wird das Object schwarz :confused:

Hat irgendjemand ideen?
Wie könnte ich das lösen?

mfG
the incredible Leitman
 
Eine Möglichkeit für solche Probleme stellt die Verwendung mehrerer Bitmap-Objekte oder GraphicsBuffer-Objekte dar. Relativ statischer Hintergrund wird dabei einmal in eine Bitmap gerendert, während ein Thread dafür sorgt, dass eine andere Bitmap für dynamische Elemente freigegeben, neu erstellt und neu gerendert wird. Anschließend werden die Bitmap-Objekte in der richtigen Reihenfolge per DrawImage gezeichnet.

GDI+ ist allerdings für Spiele zu langsam und eigentlich auch nur auf Windows-Forms-Controls ausgelegt. Für schnelle graphische Operationen rate ich ebenfalls, sich mit DirectX zu beschäftigen!

Ich hoffe, dass ich weiterhelfen konnte. :)

Gruß
PhoenixLoe
 
Zurück