Hintergrundgrafik in Spiel

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

DarkDragon hat geschrieben:
hardfalcon hat geschrieben:@Andy: Nö. Wenn man FlipBuffers() vergisst, dann blitzt für den Bruchteil einer Sekunde das erste Bild auf, und dann bleibt der Screen schwarz... Weiss ich aus eigener Erfahrung... :oops:
Dürfte es aber eigentlich nicht, denn ClearScreen sollte ja nur den Buffer mit bestimmten Werten füllen.
Und was ist, wenn Double-/TripleBuffering verwendet wird?
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Es wird der aktuelle Screenbuffer dann mit werten gefüllt, also der, welcher grad im hintergrund ist, also nicht angezeigt wird. Wird dann nach Flipbuffers() umgeschaltet und wieder ein Clearscreen() aufgerufen, so wird der andere Buffer, also der jetzt im hintergrund ist und nicht angezeicht wird, mit den gewünschten werten überschrieben.

^^Bei Triple dürfte das auch so ablaufen, oder?

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

hardfalcon hat geschrieben:
DarkDragon hat geschrieben:
hardfalcon hat geschrieben:@Andy: Nö. Wenn man FlipBuffers() vergisst, dann blitzt für den Bruchteil einer Sekunde das erste Bild auf, und dann bleibt der Screen schwarz... Weiss ich aus eigener Erfahrung... :oops:
Dürfte es aber eigentlich nicht, denn ClearScreen sollte ja nur den Buffer mit bestimmten Werten füllen.
Und was ist, wenn Double-/TripleBuffering verwendet wird?
Nur bei DoubleBuffering, bei TrippleBuffering bin ich mir nicht sicher.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
crossroads
Beiträge: 244
Registriert: 29.08.2004 05:41
Wohnort: Rhine Main Area

Re: Hintergrundgrafik in Spiel

Beitrag von crossroads »

Agent hat geschrieben:Hi Leutz.

Bin noob auf dem Game-Sektor in Sachen programmieren. Hab ein paar Test-Sachen am laufen.

Meine Frage:
Wie kann ich ein Hintergundbild in ein Spiel machen, ohne das es mein Spiel extrem verlangsamt. In meinen Tests hab ich das Bild immer in die Hauptschleife eingebunden und dort immer wieder darstellen lassen. Entweder über DrawImage (superlangsam) oder den Hintergrund als Spirte und dargestellt.

Also z.b.

Code: Alles auswählen

Repeat
  FlipBuffers()
  If IsSprite(#background_sprite) 
    ClearScreen(0,0,0)
    DisplaySprite(#background_sprite,0,0)
  Else 
    ClearScreen(rotwert,0,100)
  EndIf
 ;... Restliches Game
Until KeyboardReleased(#PB_Key_Escape)
Auf diese Art und weise wird das Spiel so extrem langsam, nicht mehr spielbar
Du solltest nur dann Zeichenoperationen ausführen, wenn bestimmte Ereignisse aufgetreten sind, die Veränderungen auf dem Bildschirm bewirken - z.B.: rechte Pfeiltaste wurde gedrückt und ein Sprite soll damit nach rechts bewegt werden.
Der Befehl FlipBuffers() gehört ans Ende der Zeichenoperationen - damit wird der neugezeichnete Screen angezeigt.

Code: Alles auswählen

OnScreen()

Repeat
  If KeyboardPushed(#PB_Key_Right)
    OnScreen()
  Else
  ;... Restliches Game
  EndIf
Until KeyboardReleased(#PB_Key_Escape)
End

Procedure OnScreen()
  If IsSprite(#background_sprite) 
    ClearScreen(0,0,0)
    DisplaySprite(#background_sprite,0,0)
  Else 
    ClearScreen(rotwert,0,100)
  EndIf
  ; weitere Zeichenoperationen ...
  FlipBuffers()
EndProcedure
hardfalcon hat geschrieben:
PureBasic-Hilfe hat geschrieben:Wenn Sie ClearScreen() verwenden, platzieren Sie diesen Befehl innerhalb des StartSpecialFX() : ... : StopSpecialFX() Programmblocks.
Vollkommen aus dem Zusammenhang gerissen - gilt nur, wenn SpecialFX-Befehle genutzt werden:
PureBasic-Hilfe hat geschrieben: Zum Beispiel sollte der gesamte SpecialFX()-Code zusammengefasst und mit einmal gerendert werden (Shadow, Translucide Sprite etc...). Standard-Sprites sollten nach einem StopSpecialFX() dargestellt werden, um die Hardwarebeschleunigung auszunutzen. Wenn Sie ClearScreen() verwenden, platzieren Sie diesen Befehl innerhalb des StartSpecialFX() : ... : StopSpecialFX() Programmblocks.

Befehle welche den SpezialFX Modus nutzen: DisplayAlphaSprite(), DisplaySolidSprite(), DisplayShadowSprite(), DisplayRGBFilter(), DisplayTranslucideSprite()
Man soll die Tür aufmachen, bevor man durchgeht ...
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag von Agent »

Hm...

Ok, sich seh schon. Riesen Diskussionen hier *hehe*

Ich werd noch ein wenig experimentieren. Wundert mich nur, dass das Problem noch niemand hatte...Ein Hintergrundbild ist doch nix besonderes....

PS: Natürlich ist der Sprite (Hintergrund) nicht grösser als der Bildschirm ;)
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Welches Problem? Du redest immer noch davon, das die Zeit die zum zeichnen eines großen Sprites relativ hoch ist?

Nun ja ich hab ein kleine Testengine gemacht gehabt, wo unteranderem ein Hintergrundsprite gezeichnet wird. Hierbei habe ich aber immer noch über 300 FPS und das, wo einige andere sachen noch neben bei gemacht werden. Das Zeichnen eines großen Sprites ist in der Tat nicht zu verachten, daher sollte sich gut überlegt werden, ob solch ein Sprite nötig ist.

In Spielen muss im Grunde ja nur der Screen vollgemalt werden. Dies kann nur 1 mal geschehen. Alle weiteren Zeichnungen übermalen die vorherigen Sprites und kosten somit zusätzlich Performence. Hast du also ein Hintergrundsprite, wird mehr als 1 mal der gesamte Screen ausgemalt, da ja nicht nur der Hintergrund dargestellt werden soll. Hast du allerdings z.B. einzellne Sprites, die nebeneinander dargestellt werden und es überlappt sich hierbei nichts. Wird der Screen genau 1 mal pro durchlauf ausgemalt. Verstanden? /:->

Naja eventuell steckt da noch mehr dahinter, aber dann muss jemand anders erklären -.-

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten