Seite 2 von 2
Verfasst: 01.09.2005 17:53
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...

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?
Verfasst: 01.09.2005 17:55
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
Verfasst: 01.09.2005 18:03
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...

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.
Re: Hintergrundgrafik in Spiel
Verfasst: 01.09.2005 18:10
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()
Verfasst: 05.09.2005 16:29
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

Verfasst: 05.09.2005 16:48
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