Und was ist, wenn Double-/TripleBuffering verwendet wird?DarkDragon hat geschrieben:Dürfte es aber eigentlich nicht, denn ClearScreen sollte ja nur den Buffer mit bestimmten Werten füllen.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...
Hintergrundgrafik in Spiel
- hardfalcon
- Beiträge: 3447
- Registriert: 29.08.2004 20:46
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
^^Bei Triple dürfte das auch so ablaufen, oder?
MFG PMV
-
DarkDragon
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Nur bei DoubleBuffering, bei TrippleBuffering bin ich mir nicht sicher.hardfalcon hat geschrieben:Und was ist, wenn Double-/TripleBuffering verwendet wird?DarkDragon hat geschrieben:Dürfte es aber eigentlich nicht, denn ClearScreen sollte ja nur den Buffer mit bestimmten Werten füllen.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...
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.
- crossroads
- Beiträge: 244
- Registriert: 29.08.2004 05:41
- Wohnort: Rhine Main Area
Re: Hintergrundgrafik in Spiel
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.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.
Auf diese Art und weise wird das Spiel so extrem langsam, nicht mehr spielbarCode: 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)
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
Vollkommen aus dem Zusammenhang gerissen - gilt nur, wenn SpecialFX-Befehle genutzt werden:hardfalcon hat geschrieben:PureBasic-Hilfe hat geschrieben:Wenn Sie ClearScreen() verwenden, platzieren Sie diesen Befehl innerhalb des StartSpecialFX() : ... : StopSpecialFX() Programmblocks.
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 ...
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
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
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
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
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