FPS Einbrüche

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

orpheus_2003

Betreff: FPS Einbrüche

BeitragDi, Sep 15, 2009 20:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Sep 15, 2009 21:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Huhu Smile

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 Sad

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 Smile

orpheus_2003

BeitragDi, Sep 15, 2009 21:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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.. Laughing

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

BeitragDi, Sep 15, 2009 21:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Sep 15, 2009 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Das grabben slowt dein game warscheinlich am meisten^^

Tankbuster

BeitragDi, Sep 15, 2009 22:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

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

BeitragDi, Sep 15, 2009 22:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BladeRunner

Moderator

BeitragMi, Sep 16, 2009 10:30
Antworten mit Zitat
Benutzer-Profile anzeigen
- 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_2003

Betreff: So gehts...

BeitragFr, Sep 18, 2009 10:18
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Sep 18, 2009 14:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile

Nicdel

BeitragFr, Sep 18, 2009 14:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Leider gibt es in BlitzBasic keine Pixmaps Wink
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

BeitragFr, Sep 18, 2009 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
@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:
user posted image

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Sep 18, 2009 15:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Sep 18, 2009 16:52
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Sep 18, 2009 17:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Sep 18, 2009 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group