geschwindigkeit eines Games
Übersicht

![]() |
BaschdiBetreff: geschwindigkeit eines Games |
![]() Antworten mit Zitat ![]() |
---|---|---|
Früher oder Später trifft es jeden der ein spiel machen will
Der schlag nämlich wenn das game (auch wenn es mit ach so viel liebe programmiert wurde) zu laggen anfängt ich wollt daher fragen wieso the fuck mein game laggt obwohl ich auf fast jede animation verzichtet habe und insgesamt 6 schleifen (die absolut norwendig sind glaube ich) am lauifen habe wovon hängt das ab...mein fps liegt bei 20/30 - 60/70 ...wie kriege ich da einen konstanten guten wert hin? danke im vorrausd mfg baschdi ach ja der code Code: [AUSKLAPPEN] ;Konstante Const Width=800 Const Height=Width*0.75 Const tile=32 ;Grafische Auflösung AppTitle"* RTS 1 *" Graphics width,height,0,2 SetBuffer BackBuffer() ;Allgemein Global xback,yback Global gfx$="gfx\",sfx$="sfx\" ;Hintergrund Global mapX=64,mapY=64 Global tileset=LoadAnimImage(gfx$+"tileset.bmp",tile,tile,0,2) : MidHandle tileset Dim map(mapX,mapY) map(5,1)=1:map(6,1)=1:map(7,1)=1 map(5,2)=1:map(6,2)=0:map(7,2)=1 map(5,3)=1:map(6,3)=0:map(7,3)=0 map(5,4)=1:map(6,4)=1:map(7,4)=1 ;Pathfinding Global PfadBank=CreateBank(2),Bsize Global mapwidth=mapX,mapheight=mapY,fightstep,schalter Dim MapData$(50),Fighter(72) Dim sqrmap(50,50),nodemap(0,0),dirx(7),diry(7),dirz(7) For i=0 To 7:Read dirx(i):Read diry(i):Read dirz(i):Next Type node Field parent.node,cost,x,y End Type Type open Field node.node End Type Type path Field node.node End Type Data 0,-1,0, -1,0,0, 1,0,0, 0,1,0 Data -1,-1,1, 1,-1,1, -1,1,1, 1,1,1 ;Maus Global mx,my,pmx,pmy Global maus=LoadImage(gfx$+"maus.bmp") Global Imaus=LoadImage(gfx$+"Imaus.bmp") ;Rand Global Bhigh=150 Global border=LoadImage(gfx$+"border.bmp") ;Einheiten Global unitMax=1:Dim unit(unitMax) For n=1 To unitMax : unit(n)=LoadImage(gfx$+"u"+n+".bmp") : MidHandle unit(n) : Next Dim IMAunit_1(7); Unit 1 For i=0 To 7 : IMAunit_1(i)=CopyImage(unit(1)) : RotateImage IMAunit_1(i),i*45 : Next Type unit Field x,y,xx,yy,xZ,yZ,xEnd,yEnd,AZx,AZy,px,py Field winkel,AttX,AttY,buuf Field sel,team,typ,action,fightstep,uPfad Field leben,sichtfeld,angriff,dauer,gesch,reich End Type ;Schuss Global treffer=LoadAnimImage(gfx$+"treffer.bmp", 12, 12, 0, 10) : MidHandle treffer Type treffer Field x,y,st End Type ;###### Hauptschleife ######; NewUnit(3*tile,6*tile,1,1) NewUnit(3*tile,7*tile,1,1) NewUnit(3*tile,8*tile,1,1) NewUnit(3*tile,9*tile,1,1) NewUnit(6*tile,9*tile,1,2) NewUnit(6*tile,8*tile,1,2) NewUnit(6*tile,7*tile,1,2) NewUnit(6*tile,6*tile,1,2) NewUnit(6*tile,12*tile,1,2) NewUnit(3*tile,10*tile,1,1) Repeat Cls ;Hintergrund malen For x=0 To mapX For y=0 To mapY DrawImage tileset,x*tile-xback,y*tile-yback,map(x,y) ;00 = frei ;01 = team 1 ;02 = team 2 ;03 = team 3 ;04 = team 4 ;09 = hinderniss ;10 = Wasser Next Next ;Units UpdateUnit() ;Treffer UpdateTreffer() ;Border DrawImage border,0,height-Bhigh ;Maus & Scrollen UpdateMaus() ms=MilliSecs():Text 0,0,fps If ms>mt mt=ms+502:fps=frame:frame=0 Else frame=frame+2 Flip Until KeyHit(1) End ;###### Funktionen ######; Function UpdateMaus() ;Maus malen mx=MouseX() my=MouseY() pmx=(mx+xback+tile/2)/tile pmy=(my+yback+tile/2)/tile DrawImage maus,mx,my DrawImage Imaus,mx,my ;Scrollen If KeyDown(200) And MouseDown(1)=0 And yback>0 Then: yback=yback-4 EndIf If KeyDown(208) And MouseDown(1)=0 And yback<mapY*tile-height+Bhigh Then: yback=yback+4 EndIf If KeyDown(205) And MouseDown(1)=0 And xback<mapX*tile-weight Then: xback=xback+4 EndIf If KeyDown(203) And MouseDown(1)=0 And xback>0 Then: xback=xback-4 EndIf End Function Function NewUnit(x,y,typ,team) u.unit=New unit u\xx=x u\yy=y u\xZ=u\xx u\yZ=u\yy u\xEnd=u\xx u\yEnd=u\yy u\px=u\xx/tile u\py=u\yy/tile u\AttX=-5 u\AttY=-5 u\team=team u\typ=typ u\dauer=400 u\leben=45 u\angriff=6 u\reich=2 u\gesch=4 u\sichtfeld=4 u\uPfad=CreateBank(2) End Function Function UpdateUnit() For u.unit=Each unit ;Bild malen u\x=u\xx-xback u\y=u\yy-yback u\px=(u\xx)/tile u\py=(u\yy)/tile If u\sel=1 Then Color 0,255,0 : Rect u\x-tile/2,u\y-tile/2,tile,tile,0 DrawImage IMAunit_1(u\winkel),u\x,u\y ;Selektieren If MouseDown(1) And ImagesCollide(maus,mx,my,0,IMAunit_1(u\winkel),u\x,u\y,0)=1 Then u\sel=1 If MouseDown(1) And ImagesCollide(maus,mx,my,0,IMAunit_1(u\winkel),u\x,u\y,0)=0 Then u\sel=0 ;Zielsuche If MouseDown(2) And u\sel=1 And map(pmx,pmy)=0 Then: u\action=1 u\xEnd=Pmx*tile u\yEnd=Pmy*tile pathfinding(u\xx/tile,u\yy/tile,u\xEnd/tile,u\yEnd/tile):u\FightStep=PfadSpliner() Bsize=BankSize(PfadBank) ResizeBank(u\uPfad,Bsize) CopyBank PfadBank, 0, u\uPfad, 0, Bsize EndIf ;Aktion If u\xx=u\xEnd And u\yy=u\yEnd Then u\action=2 ;Pathfinding If u\fightstep<0 Then u\fightstep=0 If u\fightstep<1 Then: u\xZ=u\xEnd:u\yZ=u\yEnd ElseIf u\fightstep>0 Then: u\xZ=(PeekShort(u\uPfad,u\FightStep)) u\yZ=(PeekShort(u\uPfad,u\FightStep+2)) EndIf If u\xx=u\xZ And u\yy=u\yZ And u\fightstep>0 Then u\fightstep=u\fightstep-44 ;Aktionen If u\action=0 Then: ;stehen bleiben u\xEnd=u\xZ:u\yEnd=u\yZ ElseIf u\action=1 Then: ;bewegen nach ort ;Oben -Rechts laufen If u\xZ > u\xx And u\yZ < u\yy Then: u\winkel=1 : u\xx=u\xx+u\gesch : u\yy=u\yy-u\gesch ;Unten-Rechts laufen ElseIf u\xZ > u\xx And u\yZ > u\yy Then: u\winkel=3 : u\xx=u\xx+u\gesch : u\yy=u\yy+u\gesch ;Unten-Links laufen ElseIf u\xZ < u\xx And u\yZ > u\yy Then: u\winkel=5 : u\xx=u\xx-u\gesch : u\yy=u\yy+u\gesch ;Oben -Links laufen ElseIf u\xZ < u\xx And u\yZ < u\yy Then: u\winkel=7 : u\xx=u\xx-u\gesch : u\yy=u\yy-u\gesch ;Oben laufen ElseIf u\yZ < u\yy Then: u\winkel=0 : u\yy=u\yy-u\gesch ;Unten laufen ElseIf u\yZ > u\yy Then: u\winkel=4 : u\yy=u\yy+u\gesch ;Rechts laufen ElseIf u\xZ > u\xx Then: u\winkel=2 : u\xx=u\xx+u\gesch ;Links laufen ElseIf u\xZ < u\xx Then: u\winkel=6 : u\xx=u\xx-u\gesch EndIf ElseIf u\action=2 Then: ;angreifen ohne folgen For a.unit=Each unit For o.unit=Each unit If a\AttX=-5 And a\AttY=-5 And o\xx<a\xx+u\reich*tile And o\xx>a\xx-u\reich*tile And o\yy<a\yy+u\reich*tile And o\yy>a\yy-u\reich*tile And a\team<>o\team Then: a\AttX=o\xx:a\AttY=o\yy ;: a\buuf=Rnd(1,50) ElseIf a\AttX>-5 And a\AttY>-5 And o\xx<a\xx+u\reich*tile And o\xx>a\xx-u\reich*tile And o\yy<a\yy+u\reich*tile And o\yy>a\yy-u\reich*tile And a\team<>o\team Then: a\AttX=a\AttX:a\AttY=a\AttY ;: a\buuf=Rnd(1,50) Else: a\AttX=-5:a\AttY=-5 EndIf Text 0,u\y,""+u\buuf If o\xx=a\AttX And o\yy=a\AttY And a\team<>o\team Then: a\buuf=a\buuf+1 : Color 255,255,0 If a\buuf=1 Then a\buuf=Rand(2,((2*a\dauer)/3)-2) If a\buuf>((5*a\dauer)/6) And a\buuf<a\dauer Then: Line a\x,a\y,o\x,o\y ElseIf a\buuf>a\dauer Then: a\buuf=0 : o\leben=o\leben-Rand(a\angriff-2,a\angriff+1) : a\AttX=o\xx : a\AttY=o\yy tr.treffer=New treffer tr\x=o\xx+Rand(-5,5) tr\y=o\yy+Rand(-5,5) EndIf If o\leben=0 Then a\AttX=-5 : a\AttY=-5 EndIf ;kein ziel If u\AttX<0 And u\AttY<0 Then: u\winkel=u\winkel ;Oben -Rechts angreifen ElseIf u\AttX > u\xx And u\Atty < u\yy Then: u\winkel=1 ;Unten-Rechts angreifen ElseIf u\AttX > u\xx And u\Atty > u\yy Then: u\winkel=3 ;Unten-Links angreifen ElseIf u\AttX < u\xx And u\Atty > u\yy Then: u\winkel=5 ;Oben -Links angreifen ElseIf u\AttX < u\xx And u\Atty < u\yy Then: u\winkel=7 ;Oben angreifen ElseIf u\Atty < u\yy Then: u\winkel=0 ;Unten angreifen ElseIf u\Atty > u\yy Then: u\winkel=4 ;Rechts angreifen ElseIf u\AttX > u\xx Then: u\winkel=2 ;Links angreifen ElseIf u\AttX < u\xx Then: u\winkel=6 EndIf Next Next EndIf Text u\x,u\y,u\leben ;Sterben If u\leben<1 Then: Delete u EndIf Next End Function Function pathfinding(startx,starty,endx,endy) Delete Each node Delete Each open Delete Each path Dim nodemap(mapwidth,mapheight) If startx=endx And starty=endy Then Return node.node=New node node\x=startx node\y=starty open.open=New open open\node=node nodemap(startx,starty)=1 .again2 node=Null cost=2147483647 For open=Each open delta=sqrmap(Abs(open\node\x-endx),Abs(open\node\y-endy)) If open\node\cost+delta<cost Then cost=open\node\cost+delta node=open\node tempopen.open=open EndIf Next If node=Null Then Return Delete tempopen For i=0 To 7 x=node\x+dirx(i) y=node\y+diry(i) If x=>0 And y=>0 And x<=mapwidth And y<=mapheight Then If map(x,y)=0 And nodemap(x,y)=0 Then If dirz(i)=1 Then If map(x,node\y)=1 And map(node\x,y)=1 Then Goto jump2 EndIf tempnode.node=New node tempnode\parent=node tempnode\cost=node\cost+1+dirz(i) tempnode\x=x tempnode\y=y open.open=New open open\node=tempnode nodemap(x,y)=1 If x=endx And y=endy Then finish=1:Exit .jump2 EndIf EndIf Next If finish=0 Then Goto again2 While tempnode\parent<>Null path.path=New path path\node=tempnode tempnode=tempnode\parent Wend path.path=New path path\node=tempnode End Function Function PfadSpliner() FreeBank(PfadBank):PfadBank=CreateBank(4) Color 200,0,0 For path.path=Each path If path=Last path Then Exit tmp.path=Before path If tmp=Null Then x0=path\node\x y0=path\node\y Else x0=tmp\node\x y0=tmp\node\y EndIf x1=path\node\x y1=path\node\y tmp.path=After path x2=tmp\node\x y2=tmp\node\y tmp.path=After tmp If tmp=Null Then x3=x2 y3=y2 Else x3=tmp\node\x y3=tmp\node\y EndIf spline(X0,Y0,X1,Y1,X2,Y2,X3,Y3) Next Return BankSize(PfadBank)-4 End Function Function spline(x1,y1,x2,y2,x3,y3,x4,y4) Ras=32 x1=x1*Ras:y1=y1*Ras x2=x2*Ras:y2=y2*Ras x3=x3*Ras:y3=y3*Ras x4=x4*Ras:y4=y4*Ras For u#=0 To 1.1 Step .1 u2#=u#*u# u3#=u#*u#*u# f1#=-0.5*u3#+1.0*u2#-0.5*u# f2#= 1.5*u3#-2.5*u2#+1.0 f3#=-1.5*u3#+2.0*u2#+0.5*u# f4#= 0.5*u3#-0.5*u2# x=x1*f1#+x2*f2#+x3*f3#+x4*f4# y=y1*f1#+y2*f2#+y3*f3#+y4*f4# If ax<>x Or ay<>y Then Pos=BankSize(PfadBank):ResizeBank(PfadBank,Pos+4) PokeShort(PfadBank,Pos,x) PokeShort(PfadBank,Pos+2,y) EndIf ax=x:ay=y Next End Function Function UpdateTreffer() For tr.treffer=Each treffer f=tr\st/3 If f=9 Delete tr Else DrawImage treffer,tr\x-xback,tr\y-yback,f tr\st=tr\st+1 EndIf Next End Function [Edit] sry der fps wert liegt immer bei einer zahl ...die zahl hängt von der anzahl der einheiten ab die da rumlungern..allerdings schwächt es die fps kaum wenn diese units angreifen oder sich bewegen |
||
The_Baschdi@
Wer in Ogame is soll sofort zum Orden wechseln (D.O.) --- Alle Macht dem Orden |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Doppelt verschachtelte Schleifen benötigen expotentiel mehr Rechenleistung je länger die Liste wird.
Bei 10 Einheiten werden es 10x10 = 100 Durchläufe Bei 100 Einheiten werden es 100x100 = 10'000 Durchläufe Wo nun bei dir der Code so langsam ist, kannst du leicht feststellen wenn du Flip auf 0 stellst und nacheinander deine einzelnen Update... -Funktionen ein/ausschaltest. Eine FPS-Anzeige hast du ja schon. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
TeDy14Gast |
![]() Antworten mit Zitat |
|
---|---|---|
Er hat nicht nur Doppelt verschachtelte schleifen sonderd 3 for schleifen ineinander...
undzwar bei updateunit ... Das müsstest du irgentwie anders lösen... |
||
![]() |
Baschdi |
![]() Antworten mit Zitat ![]() |
---|---|---|
jap danek ..das liegt eindeutig am
Code: [AUSKLAPPEN] for a.unit=each unit for o.unit=each unit denn wenn ich das ausschalte dann bleibt die fps egal bei wie vielen units bei 60 aber wie kann ich diese schachtelung vermeiden? es würde kaum helfen wenn ich das ganze in eine zweite funk packen würde oder? [EDIT] hab mir was überlegt: wenn ich jedem feld eine var zuweise für das was auf ihmsteht: also wenn ein unit team 1 drauf steht dann ist die var map(x,y)=1 wenn das feld begehbar ist dann 0 wenn ein stein da liegt dann 9 etc dann mus ich nicht immer wenn die unit steht überprüfen ob sie angreifen soll, sondern nur wenn jemand in reichweite ist ....das prib dabei ist nur dass ich dann 3 schleifen am anfang habe nämlich hier: Code: [AUSKLAPPEN] ;Hintergrund malen For x=0 To mapX For y=0 To mapY DrawImage tileset,x*tile-xback,y*tile-yback,map(x,y) ;00 = frei ;01 = team 1 ;02 = team 2 ;03 = team 3 ;04 = team 4 ;09 = hinderniss ;10 = Wasser for u.unit=each unit map(u\xx/tile,u\yy/tile)=u\team next Next Next [EDIT] ok habs geschafft ich hab einfach die beiden schleifen aus der 1. raus genommen aber in der selben fnk gelassen. nun ist der wert konst bei 60 egal wie viele units was tun danke für eure hilfe |
||
The_Baschdi@
Wer in Ogame is soll sofort zum Orden wechseln (D.O.) --- Alle Macht dem Orden |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group