FPS Einbrüche
Übersicht

![]() |
orpheus_2003Betreff: FPS Einbrüche |
![]() Antworten mit Zitat ![]() |
---|---|---|
So.
Ich wollte nun mal wissen ob ich das ganze herbekommen aus Blitz mehr FPS zu bekommen. Hab nen Quadcore, Geforce GTX240 und löcherliche 70 FPS bei Wizard...? Es sieht so aus: Die meisten Ressourcen werden beim Tileszeichnen verbraten. 1. Zeichnen der Map (Imagebuffer) 2. Graben eines Ausschnittes für die Kollision 3. Buffer wechseln 4. Hintergrundlayer zeichnen 5. Gegrabtes Bild aus Imagebuffer anzeigen 6. Vordergrundlayer anzeigen Haken tut es beim Hintergrundlayer, weil dort viele Icons, Anims gezeichnet werden: Code: [AUSKLAPPEN] Function DrawLayer03()
Y = 0: Repeat X = 0: Repeat X1 = MapX + X: Y1 = MapY + Y Quadrat$ = Layer$(x1,y1) BMP$ = Left$(Quadrat,1) BMPZeile = Asc( Mid$(Quadrat,2,1) ) - 65 BMPSpalte = Asc( Mid$(Quadrat,3,1) ) - 65 ; Water Fake Color 32,111,144 If Map$(X1,Y1) = "1BP" Then Rect X * 32 + MapOffsetX, Y * 32 + MapOffsetY,32,32,1 If Map$(X1,Y1) = "1BQ" Then Rect X * 32 + MapOffsetX, Y * 32 + MapOffsetY+17,32,15,1 ; Background If Layer$(X1,Y1)<> "000" Then DrawImageRect Back01 , X * 32 + MapOffsetX, Y * 32 + MapOffsetY, (BMPSpalte*34) + 2, (BMPZeile * 34) + 2, 32, 32 If Layer$(X1,Y1) = "1BO" Then DrawImage Blocksbubbles, X * 32 + MapOffsetX, Y * 32 + MapOffsetY , waterscroll/waterscrollvar ; Shop If Map$(X1,Y1) = "1CM" Then DrawImage hauschen,x*32-60 + MapOffsetX,y*32-104+ MapOffsetY ; Icons If Map$(X1,Y1) = "1CH" Then DrawImage knifeicon , X * 32 + MapOffsetX, Y * 32 + MapOffsetY If Map$(X1,Y1) = "1CI" Then DrawImage knife2icon , X * 32 + MapOffsetX, Y * 32 + MapOffsetY If Map$(X1,Y1) = "1CJ" Then DrawImage knife3icon , X * 32 + MapOffsetX, Y * 32 + MapOffsetY If Map$(X1,Y1) = "1CR" Then DrawImage knife4icon , X * 32 + MapOffsetX, Y * 32 + MapOffsetY If Map$(X1,Y1) = "1CK" Then DrawImage exitdooricon , X * 32 + MapOffsetX, Y * 32 + MapOffsetY If Map$(X1,Y1) = "1CL" Then DrawImage lifesda3D , X * 32 + MapOffsetX, Y * 32 + MapOffsetY, waterscroll/waterscrollvar/2 If Map$(X1,Y1) = "1CM" Then DrawImage hauschenicon, X * 32 + MapOffsetX, Y * 32 + MapOffsetY If Map$(X1,Y1) = "1CO" Then DrawImage Gold3D , X * 32 + MapOffsetX, Y * 32 + MapOffsetY, waterscroll/waterscrollvar If Map$(X1,Y1) = "1CQ" Then DrawImage key , X * 32 + MapOffsetX, Y * 32 + MapOffsetY If Map$(X1,Y1) = "1BK" Then DrawImage leader , X * 32 + MapOffsetX, Y * 32 + MapOffsetY ; Jumper If Map$(X1,Y1) = "1CN" And superjumpon=0 Then DrawImage jumpernorm, X * 32 + MapOffsetX, Y * 32 + MapOffsetY If Map$(X1,Y1) = "1CN" And superjumpon=1 Then DrawImage jumperani, X * 32 + MapOffsetX, Y * 32 + MapOffsetY-32, Frame2 X = X + 1: Until X = 33 Y = Y + 1: Until Y = 25 End Function Wenn ich den Block abschalte komm ich auf 117 FPS.... Was auch noch nicht so dolle ist.. Gibt es eine bessere Möglichkeit für das ganze, ausser SS? Und. Jaja. Diletantisch gecodet. Ich weiss.... Aber es tut dem ganzen ja keinen Abbruch der Schönheit wegen..... Mit Select/Case wirds auch nicht schneller..... |
||
GazerStar - the beginning
http://gazerstar.lexigame.de/ Wizard (Worktitel) http://wizard.lexigame.de |
Meik |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Huhu ![]() Vorweg: Ich hab noch nie ein 2D Jump n' Run geschrieben und hab daher nicht soviel Ahnung und blicke irgendwie nicht durch deinen code durch ![]() Ich weiss nicht ob das einfach umzusetzen wäre (vermutlich nicht ^^) aber wäre es nicht schneller wenn man mehrere gleiche Tiles zu einem image zusammen fast? Oder deine ?drei? Layer in mehrere größe images zusammen faßen ( bei einer tilegröße von 32 und einer mapgröße von zb. 2400 x 640 wären das 3 mal 800x640 pro Layer ) und noch einen 4 Layer dazu machen der nur die Kollisionen speichert? Wie gesagt ich bin kein Profi aber ich glaube 9 mal 3x1 + 1 mal 25x20 dauert nicht so lange wie 3 mal 25x20. MFG Meik ![]() |
||
![]() |
orpheus_2003 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es wird ja nur der sichtbare Teil gezeichnet.
Der erste Layer ist nur für den Kollisionsausschnitt. Der Buffer daraus wird dann auch gleich als Map gezeichnet. Der 2 Layer zeichnet mir den Background (Code oben) und die Icons und Animations. Der 3 Layer zeichnet den Vordergrund. (Haus, Wasser usw.) Und das wars. 3 Layer mit 33*25 Tiles.... Und halt die Icons.. Jedes Icon (animiert) schluckt aber so ca 2 FPS.... Echt.. ![]() Ein normaler Layer geht so: Code: [AUSKLAPPEN] Y = 0: Repeat
X = 0: Repeat X1 = MapX + X: Y1 = MapY + Y Quadrat$ = Map$(x1,y1) BMP$ = Left$(Quadrat,1) BMPZeile = Asc( Mid$(Quadrat,2,1) ) - 65 BMPSpalte = Asc( Mid$(Quadrat,3,1) ) - 65 If Map$(X1,Y1) <> "000" Then DrawImageRect ChipSet, X * 32 + MapOffsetX, Y * 32 + MapOffsetY, (BMPSpalte*34) + 2, (BMPZeile * 34) + 2, 32, 32 X = X + 1: Until X = 33 Y = Y + 1: Until Y = 25 By the way. Schluckt Grabimage auch so viel Performance? |
||
GazerStar - the beginning
http://gazerstar.lexigame.de/ Wizard (Worktitel) http://wizard.lexigame.de |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
orpheus_2003 hat Folgendes geschrieben: By the way. Schluckt Grabimage auch so viel Performance?
GrabImage arbeitet auf Pixel-zu-Pixel Basis und schluckt je nach Bildgrösse einiges an Performance. Was mir aber beim Überblicken deines Quellcodes auffällt: Warum speicherst du die ganze Map in Strings? Das ist so ziemlich das langsamste, was man machen kann, schliesslich musst du so für jedes Tile Strings zerhacken und vergleichen. Versuche, Nummern zu verwenden, wo es nur geht, da diese im Vergleich zu Strings sehr schnell verarbeitet werden. Ich bin mir nicht sicher, aber ich kann mir vorstellen, dass das Zeichnen in einen ImageBuffer auch einiges an Performance im Vergleich zum BackBuffer verschlingen kann. Ich würde mir daher nochmal überlegen, ob du deine Hauptschleife nicht ein wenig umstellen willst, damit du das ganze Bufferwechseln/Grabben gar nicht brauchst (oder ganz auf Pixelbasierende Kollision verzichtest und auf Vektorkollision umsteigst). |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
beanage.johannes |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das grabben slowt dein game warscheinlich am meisten^^ | ||
![]() |
Tankbuster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du überprüfst ein MAP(x,y) Teil immernoch, wenn schon lang klar ist, was gezeichnet wurde. Da könnte dir Select-Case wirklich noch viele FPS raushohlen ![]() Außerdem, warum vergleichst du Map(X1,Y1) immer mit einem String. Wäre es nicht besser, da eine Lösung mit Ints zu suchen. Ich stell mir vor, dass das auch etwas Leistung nimmt. |
||
Twitter
Download Jewel Snake! Windows|Android |
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Und ich stelle bei meiner neuen NVidia (GTS250) fest, dass sie die alten DX7-Pixel-basierten Befehle sogar langsamer ausführt als meine alte (leider durchgeschmolzene) ATI X700.
Neue Graphikarte heißt also bei BB icht unbedingt höchste Performance. mfG, Christoph. |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
- Auf die Stringoperationen verzichten, die kosten massenhaft Zeit.
- Auch zu prüfende Integer nur einmal aus der Map laden und daran den Vergleich machen, auch das laden eines Wertes aus dem Array kann Zeit verschlingen. -Auf die Grabberei verzichten, Kollisionen lassen sich auch wesentlich ressourcenschonender realisieren. Damit entfällt dann auch das Wechseln der Buffer was u.U. auch ein wenig Zeit braucht. - Neue Grafikhardware ist für 2D-Befehle nicht mehr so optimiert wie es ältere Modelle waren. Hier wäre es eine Überlegung wert auf Draw3D oder etwas ähnliches umzusteigen (Tiles als Quads, single surface zu erstellen, Textur flippen). Nebenbei erwähnt ist auch der Quadcore kein Garant für geschwindigkeit, da ja BB kein Multithreading benutzt und daher nur auf einem Kern läuft. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
orpheus_2003Betreff: So gehts... |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab nun die Lösung dank euch allen.
Super geholfen hat mir der Tipp von BladeRunner, Noobody,Tankbuster und andere.. So siehts aus. - GRABIMAGE: am meisten verbraten hab ich wirklich mit dem Grabimage. Das saugt bis 150 FPS... Ohne Grabimage hab ich ~280 FPS. Mit Grabimage 148 FPS.. So siehts aus. - STRINGS: Auch die String Abfragen und DIM Map mit Strings und Kollisionsabfragen mit Strings schrauben an der Performance. Hab nun die Engine teilweise umgeschrieben. Alles nun auf Integer gemacht. Und siehe da. Die Engine läuft nun auf 3 Layern mit 148 FPS und Grabimage gleichzeitig. War ne Heidenarbeit aber es läuft nun. - KOLLISION: Wenn ich noch von Grabimage auf Boxcollision oder Vektoren umsteige gibt das noch ein bischen mehr her. Danke an alle für eure Hilfe..... |
||
GazerStar - the beginning
http://gazerstar.lexigame.de/ Wizard (Worktitel) http://wizard.lexigame.de |
![]() |
beanage.johannes |
![]() Antworten mit Zitat ![]() |
---|---|---|
gute ache, aber eine frage hätte ich da noch^^ wie prüft man mit grabimage bitte die kollision? an deiner stelle würde ich dazu ein großes pixmap nehmen und die kollision, schnell+pixelgenau zu überprüfen ![]() |
||
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Leider gibt es in BlitzBasic keine Pixmaps ![]() |
||
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7 |
![]() |
orpheus_2003 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@jwolf555
Ich prerendere die Hauptmap (jaja. rerender.. *g+) in den imagebuffer. Dann schneide ich dort wo die Spielfigur ist ein rechteck aus. Mit diesem wird dann der Player pixelgenau geprüft. Und dann wird das bild einfach in die Renderengine des Games mitaufgenommen und gezeichnet, damit es nicht 2 mal laufen mus.. So läuft mal meine Pixelkollision. Wenn du das Game runterlädst kannst du mit F6 das anzeigen lassen. Rechts oben siehst du dann den gegrabten spriteauschnitt.... Code: Code: [AUSKLAPPEN] SetBuffer ImageBuffer(Layer_3)
Y = 0: Repeat X = 0: Repeat ; Hier die Map zeichnen X = X + 1: Until X = 33 Y = Y + 1: Until Y = 25 ;--==>> grab image into buffer for checking collisions GrabImage GrabLayer, CharacterX, CharacterY SetBuffer BackBuffer() End Function So sieht das aus: Unter der FPS Anzeige: ![]() |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wieviele layer hast du, und auf wie vielen davon wird eine Kollision auf dem Spieler angewendet?
Ich bin mir sicher, dass man das ganze wesentlich einfacher und schneller mit einer ''gewöhlichen'' Tilemap erledigen kann. Noch nebenbei zu beachten gilt, dass pixelgenaues überprüfen wohl auf bestimmten Systemen Probleme bereiten kann. Da gab es mal ein Thread zu. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
orpheus_2003 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@hectic
Ja da stimm ich dir zu. Ich bin gerade dran das Grabimage rauszunehmen und eine normale Tileprüfung mit Boxes zu machen. Das dauert aber noch, dafür springen 150 FPS raus. War halt der Anfang den ich gemacht habe und am Anfang stört das auch nicht. Funktioniert prima. Bis halt das ganze wächst und einbricht. Aber so langsam dank viel Hilfe von euch krieg ichs flott und gut hin. Demnächst eine Version ohne Pixelkolli und mit sauviel FPS.... Thx & Greets |
||
GazerStar - the beginning
http://gazerstar.lexigame.de/ Wizard (Worktitel) http://wizard.lexigame.de |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn Beispielsweise der Player die größe eines Tiles nicht überschreitet, dann kann der Player maximal mit 4 umliegenden Tiles zur selben Zeit kollidieren. Prüft man nun nur auf diese, dann ergibt das ein erheblichen FPS-Schub.
Die zu überprüfende Tiles errechnen sich auf ähnlicher Weise wie der sichtbare Bereich einer Tilemap die größer als der Bildschirmbereich ist. Die Playerposition +/- das umliegende Offset entspricht das Tile aus dem 2D-Array. - Das Problem mit der pixelgenauen Kollisionsfrage ist im übrigen keine Geschwindigkeitsfrage, sondern eine Kompatibilitätsgeschichte. Da bestimmt Systeme da anscheinend Probleme mit haben und grundlos abstürzen oder so. Selber habe ich es noch nicht nachrekonstruiert. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
orpheus_2003 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja ich weiss. Die sache mit Collide ist buggy.
Da mit den umgebenden Tiles mache ich schon bei der Kollision der Icons, Waffen usw. Nur für die Map wollte ich ne Pixelkollision. Aber ich werds mal checken wies läuft. |
||
GazerStar - the beginning
http://gazerstar.lexigame.de/ Wizard (Worktitel) http://wizard.lexigame.de |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group