2D Tiles schneller scrollen

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

PSY

Betreff: 2D Tiles schneller scrollen

BeitragSa, Jan 22, 2005 7:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hiho,

für einen Boulder Dash Clone muss ich ca. 25*17 Tiles, jedes aus 32*32 pixel bestehend, scrollen.

Hier mal ein Code, um die Geschwindigkeit zu testen. Hat jemand ne Idee, ob das Scrollen noch schneller geht, oder ist der Code hier nicht mehr in Sachen Geschwindigkeit zu verbessern?

Vielen Dank schonmal,
PSY

Code: [AUSKLAPPEN]
Graphics 800,600,16

SetBuffer BackBuffer()
Dim gfx(9)
 
;boxen erstellen + einfärben
for i=0 to 9
   Color rnd(255), rnd(255), rnd(255)
   Rect 0,0,32,32,1
    gfx(i)=createimage(32,32)
    GrabImage gfx(i),0,0
next


;speed faktor (anzahl pixel die gescrollt werden)
speed=2
 
dim level(99,99)
 
for x=0 to 99
   for y=0 to 99
      level(x,y)=rnd(9)
   next
next
 
repeat
   cls
   if keydown(203) And px>0
      if ox<32
         ox=ox+speed
      else
         ox=0
         px=px-1
      endif
   endif
 
   if keydown(205) and px<75
      if ox>-32
         ox=ox-speed
      else
         ox=0
         px=px+1
      endif
   endif
 
   if keydown(200) And py>0
      if oy<32
         oy=oy+speed
      else
         oy=0
         py=py-1
      endif
   endif
 
   if keydown(208) And py<82
      if oy>-32
         oy=oy-speed
      else
         oy=0
         py=py+1
      endif
   endif
 
   for x=-1 to 25
      for y=-1 to 19
          tile=level(x+px,y+py)
              If tile>0 And tile<11 Then drawblock gfx(tile),x*32+ox,y*32+oy
       next
   next
 
  Flip 0
 
until KeyHit(1)
 
End

rambo256

BeitragSa, Jan 22, 2005 10:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich denke jetzt einfach mal,das das Programm zu langsam läuft.
Das liegt meistens daran,dass Tiles gezeichnet werden,die man gar nicht sieht.Ich glaub du zeichnest bestimmt die ganze Map,anstatt nur den Teil,den man auch wirklich auf dem Bildschirm sieht.Dieses "Verfahren" nennt man Culling. Auch hilft es meistens bei einer Tile-based-engine,das man nicht das erste tile zu zeichnen brauch (meistens ist es das Tile,womit man im Editor die Funktion eine Art Radiergummi gebraucht).Dieses brauch man auch nicht zu zeichnen,und das macht bestimmt auch einen großen Teil aus.

Also:

-culling
- nicht das "Grundtile" zeichnen
Asus F53z

Das Leben ist eine reine Konkatenation...

TrunkZ

BeitragSa, Jan 22, 2005 11:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich richtig liege, heißt das im 2D-Bereich aber Clipping, und nicht Culling.
User posted image User posted image
Auch so ein tolles Statusbild? Dark-Lightning Studios PBanner-Service

rambo256

BeitragSa, Jan 22, 2005 11:30
Antworten mit Zitat
Benutzer-Profile anzeigen
sry,natürlich clipping Embarassed
Asus F53z

Das Leben ist eine reine Konkatenation...

Hubsi

BeitragSa, Jan 22, 2005 11:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Auf den ersten Blick sieht der Code recht ordentlich aus. DasCode: [AUSKLAPPEN]
tile=level(x+px,y+py)
If tile>0 And tile<11 Then drawblock gfx(tile)
könnte man noch soweit zusammenkürzen:Code: [AUSKLAPPEN]
drawblock gfx(level(x+px,y+py))
Im Speed wirst Du das aber nicht bemerken. Was mir nicht einleuchtet: Du bewegst den Spieler um jeweils 1 Pixel, scrollst aber 2 Pixel? Wirkt das nicht etwas ruckelig?
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

PSY

Betreff: Tiles

BeitragSa, Jan 22, 2005 14:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

danke erstmal für die Antworten Smile

@rambo:
Code: [AUSKLAPPEN]
for x=-1 to 25
      for y=-1 to 19


ich zeichne nur die sichtbaren tiles auf dem Bildschirm + eine Umrandung.
(also 27*21 tiles hier im beispiel). weniger geht nicht wenn ich den screen scrollen muss Sad

@hubsi
Code: [AUSKLAPPEN]
If tile>0 And tile<11

wenn ich die abfrage weglassen würde, käme ein memory fehler, da es z.b. level (-1,-1) nicht gibt. Muss ich aber so laufen lassen, weil ich wegen dem scrolling eine extra Zeile/Spalte Tiles zeichen muss.

Zitat:
Im Speed wirst Du das aber nicht bemerken. Was mir nicht einleuchtet: Du bewegst den Spieler um jeweils 1 Pixel, scrollst aber 2 Pixel? Wirkt das nicht etwas ruckelig?

hm ich hab hier noch keinen spieler implementiert. ich scrolle bloss die hintergrundtiles. px bzw. py ist der wert, um wieviel tiles das level in x bzw y richtung schon gescrollt ist Wink

kopierts mal einfach in den editor und startet es, dann seht ihr was ich meine. ist halt relativ langsam Sad

Hubsi

BeitragSa, Jan 22, 2005 14:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab mich etwas unglücklich ausgedrückt. die If soll schon stehen bleiben, nur die Zeile tile=level... könnte man dadurch einsparen Wink um es schneller zu scrollen würd ich einfach spedd auf 4 Pixel einstellen?
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

TheShadow

Moderator

BeitragSa, Jan 22, 2005 21:01
Antworten mit Zitat
Benutzer-Profile anzeigen
die "Bremse" ist bei dir in FOR-Schleifen. Und diese IF's wirken sich fast gar nicht auf Geschw. aus - DrawBlock ist die Hauptbremse

Mit dem code solltest du viele fps haben...
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

PSY

Betreff: 2D Tiles schneller scrollen

BeitragSa, Jan 22, 2005 22:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hoi,

@hubsi
Zitat:
Hab mich etwas unglücklich ausgedrückt. die If soll schon stehen bleiben, nur die Zeile tile=level... könnte man dadurch einsparen um es schneller zu scrollen würd ich einfach spedd auf 4 Pixel einstellen?


ja dann scrollt er schneller. aber halt nicht so weich Very Happy


@shadow
Zitat:
DrawBlock ist die Hauptbremse

jo ist halt langsam. gibts ne alternative zu drawblock? oder ne alternative, tiles übern anderen weg zu zeichnen?

Zitat:
Mit dem code solltest du viele fps haben...

170-180 rum. spielt dabei halt keine rolle ob ich scrolle oder nicht. das ist schonmal ein vorteil Laughing
naja nützt halt nix, wenn ich 170 frames hab, aber die graka wegen drawblock nicht nachkommt. aber egal, ist ja eh nur der leveleditor. sobald ich das game auf blitz portiert hab, seh ich ja wies läuft. wenn die scrollgeschwindigkeit so bleibt, sollte es funzen. zeit für die anderen abfragen bleibt genug, da ich das scrollen timerbasiert mache. denke es werden dann einige fps mehr rauskommen. was das scrollen aber nicht schneller macht.
falls ich es überhaupt umgesetzt bekomme. naja die hilfe ist gegenüber DB schonmal um längen besser, das is mal positiv Rolling Eyes


l8er,
PSY
 

Hot-Bit

Sieger des B2D Retro Wettbewerb / Aug 04

BeitragSo, Jan 23, 2005 0:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hoi.

Also, um mal wieder blöd dazustehen, ich fühle mich irgendwie verarscht !
Denn der Code ist optimal abgestimmt.

Ich habe knapp um die 500 FPS.

Habe selbst eine Routine, welche etwas langsamer ist, obwohl mir beim seitwärts-scrollen, ab und zu meine Routine schneller vorkommt.

Diese Routine ist um ca. 20 FPS langsamer.
Wer es testen will, soll die FPS-Routine in den Code von ihm kopieren.




Code: [AUSKLAPPEN]
Graphics 800,600,16

SetBuffer BackBuffer()
Dim gfx(9)
 
;boxen erstellen + einfärben
For i=0 To 9
   Color Rnd(255), Rnd(255), Rnd(255)
   Rect 0,0,32,32,1
    gfx(i)=CreateImage(32,32)
    GrabImage gfx(i),0,0
Next
Color 255,255,255

;speed faktor (anzahl pixel die gescrollt werden)
speed=2
 
Dim level(99,99)
 
For x=0 To 99
   For y=0 To 99
      level(x,y)=Rnd(9)
   Next
Next
 

xmap=0:ymap=0:ox=32:oy=32

Repeat
   Cls
   If KeyDown(203)
     If xmap>0
       ox=ox+speed
       If ox>32 ox=ox-32:xmap=xmap-1
     EndIf
   EndIf
 
   If KeyDown(205) 
      If xmap<74
        ox=ox-speed
        If ox<0 ox=ox+32:xmap=xmap+1
     EndIf
   EndIf
 
   If KeyDown(200)
     If ymap>0
       oy=oy+speed
       If oy>32 oy=oy-32:ymap=ymap-1
     EndIf
 
   EndIf
 
   If KeyDown(208) 
     If ymap<80
      oy=oy-speed
      If oy<0 oy=oy+32:ymap=ymap+1
     EndIf
   EndIf
 
   For x=0 To 25
      For y=0 To 19
          DrawBlock gfx(level(xmap+x,ymap+y)),x Shl 5 +ox-32,y Shl 5 +oy-32
       Next
   Next

    fps2 = fps2 + 1
   If fpstimer + 1000 < MilliSecs() Then
    fpsc = fps2:fps2 = 0:fpstimer = MilliSecs()
   End If
   Text 70,40,fpsc

  Flip 0
Until KeyHit(1)
 
End


Sollte das ganze hier nur eine Vorstellung deiner Programmier-Künste sein ?
(Ich bin immer etwas skeptisch) Smile


Toni
... ..... .i.. ...

***
Sieger des BB-Gameboy-Contest 2004
Sieger des Blitzbaster 2D-Minigolf-Contest 2005
***

PSY

BeitragSo, Jan 23, 2005 5:59
Antworten mit Zitat
Benutzer-Profile anzeigen
hoi,

@a-bit 8)

Zitat:
Hoi.

Also, um mal wieder blöd dazustehen, ich fühle mich irgendwie verarscht !


geht mir auch immer so, sobald ich meinen pc einschalt Razz
nee im ernst, ich will dich ganz sicher nicht verarschen...rest weiter unten

Zitat:

Denn der Code ist optimal abgestimmt.
Ich habe knapp um die 500 FPS.


mh hab nur um die 180 rum. mit nem p4 2,4ghz und ner asusfx5800. naja zeit zum aufrüsten Very Happy
fps hat nix zu sagen bei diesem speziellen 2D-fall.
selbst wenn die fps2000000 wär und das scrolling so langsam wie in dem code, würds mir nix nützen Twisted Evil
ich weiss, fürs spiel reicht die geschwindigkeit grad so. aber ich wollt halt mal wissen wie schnell bb screens gefüllt mit tiles maximal scrollen kann Smile


Zitat:

Sollte das ganze hier nur eine Vorstellung deiner Programmier-Künste sein ?

ganz sicher nicht. um nen paar tiles zu scrollen, bedarf es keine programmierkünste Wink


Zitat:

(Ich bin immer etwas skeptisch) Smile


sowas kann nicht schaden *g*


grüsse,
PSY

TheShadow

Moderator

BeitragSo, Jan 23, 2005 14:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
mh hab nur um die 180 rum. mit nem p4 2,4ghz und ner asusfx5800. naja zeit zum aufrüsten


wow wow da stimmt etwas mit deinem system nicht. ich habe P800 mit alter karte - und ich müsste mehr FPS haben...

FLIP 0 nimm gleich raus - weil es z.B. bei mir nicht gut läuft. Ist aber dein Spiel - deswegen mach was du willst...

mein Code der Tileengine ist viel umfangreicher:

Code: [AUSKLAPPEN]

  For y=starty To endy
    For x=startx To endx

      If layer\depth1=4 Then
        offset=((y*layer\sizex+x)/2)
        mode  =((y*layer\sizex+x) And 1)*4
        value =(PeekByte(layer\bank1,offset) Shr mode) And 15
      ElseIf layer\depth1=8 Then
        offset=y*layer\sizex+x
        value =PeekByte(layer\bank1,offset)
      ElseIf layer\depth1=12 Then
        offset=((y*layer\sizex+x)*3)/2
        mode  =((y*layer\sizex+x) And 1)*4
        value =(PeekShort(layer\bank1,offset) Shr mode) And 4095
      ElseIf layer\depth1=16 Then
        offset=(y*layer\sizex+x)*2
        value =PeekShort(layer\bank1,offset)
      EndIf

      If value=>1 And value<=anims Then
        bank=PeekInt(layer\tile\banka,value*4-4)
        start=PeekShort(bank,10)
        frame=PeekShort(bank,start*4+8)
      Else
        frame=value-anims
      EndIf

      If frame=>1 And frame<=count Then
        xx=px+x*sizex
        yy=py+y*sizey
        If layer\mask=0 Then DrawBlock image,xx,yy,frame-1
        If layer\mask=1 Then DrawImage image,xx,yy,frame-1
      EndIf

    Next
  Next
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Ralf

BeitragSo, Jan 23, 2005 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

da Boulder Dash keinen besonders großen Screen braucht, würde ich die Sache ganz anders angehen:
Einen Screen, meinetwegen 3200*3200 Pixel erstellen, das schafft jede Grafikkarte ohne Probleme.
Dann die Tiles direkt in den ImageBuffers des Screens zeichen.
Veränderungen des Hintergrunds während des Spiels dann wieder in den ImageBuffer einzeichen.
Für die Kollisionsabfrage des Players:
Einfach die Position des Players berechnen, und nur die Blöcke um ihn herum auf Kollision prüfen, das wären maximal 9 Stück.
Dies funktioniert aber nur vernünftig, wenn alle Tiles die gleiche Größe haben.

Dadurch braucht nur der Screen gescrollt zu werden, was eine enorme Geschwindigkeitssteigerung bringt.
Ich habe mal das Beispiel von a-Bit genommen und umgeschrieben:
Vorher: 530 fps
Nachher: 1850 fps

Ich schreibe gerade ein Spiel, bei dem ich dies so gelöst habe. Es funktioniert. auch mit der Kollisionsabfrage, bisher ohne Probleme

Hier der Code:
Code: [AUSKLAPPEN]
Graphics 800,600,16

SetBuffer BackBuffer()
Dim gfx(9)
 
;boxen erstellen + einfärben
For i=0 To 9
   Color Rnd(255), Rnd(255), Rnd(255)
   Rect 0,0,32,32,1
    gfx(i)=CreateImage(32,32)
    GrabImage gfx(i),0,0
Next
Color 255,255,255

;speed faktor (anzahl pixel die gescrollt werden)
speed=2
 
Dim level(99,99)

; screen erstellen
back=CreateImage(3200,3200)
SetBuffer ImageBuffer(back)
For x=0 To 99
   For y=0 To 99
      im=Rand(9)     
      level(x,y)=im
      DrawImage gfx(im),x*32,y*32
   Next
Next
SetBuffer BackBuffer()

xmap=0:ymap=0

Repeat
   Cls
   If KeyDown(203)
     If xmap<0 And xmap>=-2400
       xmap=xmap+speed
     EndIf
   EndIf
 
   If KeyDown(205)
      If xmap>-2400 And xmap<=0
        xmap=xmap-speed
     EndIf
   EndIf
 
   If KeyDown(200)
     If ymap<0 And ymap>=-2400-speed
       ymap=ymap+speed
     EndIf

   EndIf

   If KeyDown(208)
     If ymap>-2400 And ymap<=0
      ymap=ymap-speed
     EndIf
   EndIf
 
   DrawBlock back,xmap,ymap
   
    fps2 = fps2 + 1
   If fpstimer + 1000 < MilliSecs() Then
    fpsc = fps2:fps2 = 0:fpstimer = MilliSecs()
   End If
   Text 70,40,fpsc

  Flip 0
Until KeyHit(1)
 
End


Ralf
 

Hot-Bit

Sieger des B2D Retro Wettbewerb / Aug 04

BeitragSo, Jan 23, 2005 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
hoi.

Fein gemacht.

Das steigert die Geschwindigkeit enorm. Good Work !

Toni
... ..... .i.. ...

***
Sieger des BB-Gameboy-Contest 2004
Sieger des Blitzbaster 2D-Minigolf-Contest 2005
***

PSY

Betreff: 2D Tiles schneller scrollen

BeitragSo, Jan 23, 2005 20:09
Antworten mit Zitat
Benutzer-Profile anzeigen
hoi,

@ralf:

schon krass was das fürnen enormen geschwindigkeitsschub bringt, wenn man statt ner menge kleiner bilder den ganzen screen scrollt. wieder mal was dazugelernt Very Happy

vielen dank ralf, und natürlich auch an alle anderen Exclamation

die collision usw. steht schon alles, das spiel war ja eigentlich fertig bis auf die highscoreliste. (in darkbasic). naja ich werd jetzt mal alles nach BB porten und die techik von dir benutzen Wink

private note an mich: ein grosses bild scrollt VIIEEELLL schneller als mehrere kleine bilder Idea 8) Idea

soli

BeitragSo, Jan 23, 2005 20:35
Antworten mit Zitat
Benutzer-Profile anzeigen
@psy
Flip 0 kann wirklich Probleme machen.
Hatten wir hier schon mal.
http://wp1002880.wp004.webpack...p;start=60

@hot-bit
psy kommt glaube ich von dark- oder purebasic,
kann also wohl coden, seine Frage bezieht sich
auf Blitz Eigenheiten.
solitaire

Ralf

BeitragSo, Jan 23, 2005 20:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

freut mich wenn ich helfen konnte!
Ist aber eigentlich logisch das ein einziger Befehl wesentlich schneller ist, als 520mal eine Schleife durchlaufen, in der auch noch Berechnungen stattfinden. Die Frage war nur wieviel schneller!
Das ist ja nun geklärt.

Wie dem auch sei, viel Spass beim Umschreiben Laughing

Achja: Danke für das Lob, Toni. Werde ich mir ausdrucken und vor dem Monitor kleben Wink

Ralf
 

Hot-Bit

Sieger des B2D Retro Wettbewerb / Aug 04

BeitragSo, Jan 23, 2005 20:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hoi.

Bitte, bitte ...

Man tut, was man kann (soll, muß, ...) Smile

Nee, Spaß beiseite.

Was wiegt, das hat's !

Ganz einfach.

Toni
... ..... .i.. ...

***
Sieger des BB-Gameboy-Contest 2004
Sieger des Blitzbaster 2D-Minigolf-Contest 2005
***

PSY

Betreff: 2D Tiles schneller scrollen

BeitragSo, Jan 23, 2005 20:51
Antworten mit Zitat
Benutzer-Profile anzeigen
@soli

jo stimmt. hab halt versucht alles an speed rauszukitzeln was möglich ist. hat sich ja nun erledigt Very Happy

danke nochmal an alle,

PSY

TheShadow

Moderator

BeitragSo, Jan 23, 2005 21:15
Antworten mit Zitat
Benutzer-Profile anzeigen
hm Wink

3200x3200x4:1024:1024=39MB... Da steigt meine Grafikkarte aus...

Mein Vorschlag: du machst ein TMP-Image. Du zeichnest die Map 1x dort ein und benutzt das TMP-Image mit einem drawblock-Befehl...

zum verschieben benutzt du copyrect und zeichnest paar tiles drumherum neu...
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group