geschwindigkeit eines Games

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Baschdi

Betreff: geschwindigkeit eines Games

BeitragDo, Dez 27, 2007 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Dez 27, 2007 13:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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
 

TeDy14

Gast

BeitragDo, Dez 27, 2007 13:07
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

BeitragDo, Dez 27, 2007 13:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group