2D Tiles schneller scrollen
Übersicht

![]() |
PSYBetreff: 2D Tiles schneller scrollen |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
sry,natürlich clipping ![]() |
||
Asus F53z
Das Leben ist eine reine Konkatenation... |
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Auf den ersten Blick sieht der Code recht ordentlich aus. DasCode: [AUSKLAPPEN] tile=level(x+px,y+py)
könnte man noch soweit zusammenkürzen:Code: [AUSKLAPPEN] If tile>0 And tile<11 Then drawblock gfx(tile) 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... |
![]() |
PSYBetreff: Tiles |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
danke erstmal für die Antworten ![]() @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 ![]() @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 ![]() kopierts mal einfach in den editor und startet es, dann seht ihr was ich meine. ist halt relativ langsam ![]() |
||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hab mich etwas unglücklich ausgedrückt. die If soll schon stehen bleiben, nur die Zeile tile=level... könnte man dadurch einsparen ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
PSYBetreff: 2D Tiles schneller scrollen |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() @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 ![]() 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 ![]() l8er, PSY |
||
Hot-BitSieger des B2D Retro Wettbewerb / Aug 04 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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) ![]() Toni |
||
... ..... .i.. ...
*** Sieger des BB-Gameboy-Contest 2004 Sieger des Blitzbaster 2D-Minigolf-Contest 2005 *** |
![]() |
PSY |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 ![]() 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 ![]() 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 ![]() 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 ![]() Zitat: (Ich bin immer etwas skeptisch) ![]() sowas kann nicht schaden *g* grüsse, PSY |
||
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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-BitSieger des B2D Retro Wettbewerb / Aug 04 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 *** |
![]() |
PSYBetreff: 2D Tiles schneller scrollen |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() vielen dank ralf, und natürlich auch an alle anderen ![]() 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 ![]() private note an mich: ein grosses bild scrollt VIIEEELLL schneller als mehrere kleine bilder ![]() ![]() |
||
![]() |
soli |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Achja: Danke für das Lob, Toni. Werde ich mir ausdrucken und vor dem Monitor kleben ![]() Ralf |
||
Hot-BitSieger des B2D Retro Wettbewerb / Aug 04 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hoi.
Bitte, bitte ... Man tut, was man kann (soll, muß, ...) ![]() 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 *** |
![]() |
PSYBetreff: 2D Tiles schneller scrollen |
![]() Antworten mit Zitat ![]() |
---|---|---|
@soli
jo stimmt. hab halt versucht alles an speed rauszukitzeln was möglich ist. hat sich ja nun erledigt ![]() danke nochmal an alle, PSY |
||
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
hm ![]() 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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group