[B3D] Plötzlicher FPS verlust... !?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

ToeB

Betreff: [B3D] Plötzlicher FPS verlust... !?

BeitragSa, Mai 10, 2008 11:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich hab ein problem und zwar mit meiner "KI". Die soll nämlich jetzt einfach zufällig inner map rumlaufen und wenn eine Wand kommt, dann soll es die richtung wechseln. Das funzt auch, nur es gibt oft FPS-verluste, ich weis nicht woran es liegt. Das Spiel läuft bei mir ohne KI mit 75/76 FPS und wenn die KI dann läuft fällt es manchmal auf 38 zurück, geht dann aber wieder schnell auf 75 FPS zurück. Wisst ihr warum ?

Hier mal der Code: [AUSKLAPPEN]
Graphics3D 1024,768,16,1
SetBuffer BackBuffer()

SeedRnd MilliSecs()

Global p_anz = 2

Dim acc(p_anz),mesh(p_anz),tot(p_anz),lebn#(p_anz),enz#(p_anz),enx#(p_anz),rich(p_anz),tu(p_anz),gpiv(p_anz)
Dim frei(3)

mesh(0) = LoadAnimMesh("Modells\Man.b3d")
ScaleEntity mesh(0),0.04,0.04,0.04
For i = 1 To p_anz
   mesh(i) = CopyMesh(mesh(0))
   ScaleEntity mesh(i),0.04,0.04,0.04
   PositionEntity mesh(i),0,1.75,0
   gpiv(i) = CreatePivot()
   ScaleEntity gpiv(i),25,25,25
   tot(i) = 1
   Lebn(i) = 0
   acc(i) = 2
   rich(i) = Rand(0,3)
   HideEntity mesh(i)
Next
acc(0) = 1
Lebn(0) = 100
tot(0) = 0

EntityAlpha(mesh(0),0)
PositionEntity mesh(0),5,1.75,5

Global c = CreateCamera(mesh(0))
   ScaleEntity c,25,25,25
   CameraClsColor c,80,160,150
   CameraRange c,0.1,100
   PositionEntity c,0,35,0
   CameraFogMode c,1
   CameraFogRange c,10,150
   CameraFogColor c,80,160,150
   EntityRadius mesh(0),0.7
   EntityType mesh(0),1
   
Global sky = CreateSphere(25)
   ScaleEntity sky,80,80,80
   FlipMesh(sky)
   tex = LoadTexture("Texture\sky1.jpg")
   EntityTexture sky,tex
   

Global plane = CreatePlane()
   tex = LoadTexture("Texture\Ground1.jpg")
   ScaleTexture tex,5,5
   EntityTexture plane,tex


Global Hand = LoadMesh("Modells\Hand.b3d",c)
   ScaleEntity Hand,0.007,0.007,0.007
   PositionEntity Hand,0.1,-0.2,0.3
   
Global light = CreateLight()
   RotateEntity light,30,45,0

Dim tex_(1)
For i = 0 To 1
   tex_(i) = LoadTexture("Texture\Wall"+(i+1)+".jpg")
Next

Type tilemap
   Field cube,show
End Type
   
mpf=ReadFile("Maps\map"+1+".map")
   For i=0 To 40
      For o=0 To 40
         tile=ReadByte(mpf)
         If tile=1
            map.tileMap = New tilemap
            map\cube = CreateCube()
            ScaleEntity map\cube,2,4,2
            EntityTexture map\cube,tex_(Rand(0,1))
            EntityBox map\cube,-2,-4,-2,4,8,4
            EntityType map\cube,2
            PositionEntity map\cube,i*4,4,o*4
            EntityPickMode map\cube,3
            EntityAlpha(map\cube,0.5)
            ;EntityAutoFade(map\cube,75,80)
            map\show = 1
         EndIf
      Next
   Next
CloseFile mpf

FreeTexture tex_(0)
FreeTexture tex_(1)

Collisions 1,2,3,2
   
Global timer = CreateTimer(75)   

Global FPS_COUNT,FPS_MS=MilliSecs()+1000,FPS = 0
Global x#,y#,msp#=0.5,mxalt#,myalt#,mx#,my#,Hand_w

Repeat
   If FPS_MS < MilliSecs() Then FPS = FPS_COUNT:FPS_COUNT = 0:FPS_MS = MilliSecs()+1000
   y = (KeyDown(17)-KeyDown(31))
   x = (KeyDown(32)-KeyDown(30))
   If x And y
      x = x * Sin(45)
      y = y * Sin(45)
   EndIf
   If x Or y
      Hand_w = Hand_w + 5
      If Hand_w > 360 Hand_w = Hand_w - 360
   EndIf
   mxalt#=mxalt-(mxalt-MouseXSpeed()*msp)/2
   myalt#=myalt-(myalt-MouseYSpeed()*msp)/2
   mx# = EntityYaw#(mesh(0)) - mxalt#
   my# = EntityPitch#(c) + myalt#
   If my# < -70 Then my# = -70
   If my# >  70 Then my# =  70
   MoveEntity mesh(0),x/10,0,y/10
   RotateEntity mesh(0),0,mx,0
   RotateEntity c,my,0,0
   PositionEntity sky,EntityX(mesh(0)),0,EntityZ(mesh(0))
   PositionEntity Hand,0.1+Cos(Hand_w)/140,-0.2+Cos(Hand_w)/140,0.3
   MoveMouse  512,384
   For map.tilemap = Each tilemap
      If EntityInView(map\cube,c)=0 Then
         If map\show = 1 HideEntity map\cube:map\show = 0
      Else
         If map\show = 0 ShowEntity map\cube:map\show = 1
      EndIf
   Next
   For i = 1 To p_anz
      If acc(i)=2 Then
         If tot(i) = 0
            enx(i) = EntityX(mesh(i))
            enz(i) = EntityZ(mesh(i))
            frei(0)=LinePick(enx(i),0,enz(i)-.4,0,0,-1.1,.2)<>0
            frei(1)=LinePick(enx(i)+.4,0,enz(i),1.1,0,0,.2)<>0
            frei(2)=LinePick(enx(i),0,enz(i)+.4,0,0,1.1,.2)<>0
            frei(3)=LinePick(enx(i)-.4,0,enz(i),-1.1,0,0,.2)<>0
            If frei(rich(i))  Or Rand(500)=1 Then
               freie = 0
               For a = 0 To 3
                  If frei(a)=0 freie = freie + 1
               Next
               If freie < 4 ;Wenn min. 1 Feld nicht frei ist
                  If rich(i) = 0 RUCK=2:LINKS=1:RECHTS=3
                  If rich(i) = 1 UCK=3:LINKS=0:RECHTS=2
                  If rich(i) = 2 RUCK=0:LINKS=3:RECHTS=1
                  If rich(i) = 3 RUCK=1:LINKS=2:RECHTS=0
                  If frei(LINKS)=0 And frei(RECHTS)=0 Then r = Rand(0,1):If r=0 rich(i) = LINKS Else rich(i) = RECHTS
                  If frei(LINKS)=0 And frei(RECHTS)   Then rich(i) = LINKS
                  If frei(LINKS)   And frei(RECHTS)=0 Then rich(i) = RECHTS
                  If frei(LINKS)   And frei(RECHTS)   Then rich(i) = RUCK
               Else
                  rich(i) = Rand(0,3)
               EndIf
            EndIf
            Select rich(i)
            Case 0
               ruck = 1
               vor = 0
               links = 0
               rechts = 0
            Case 1
               ruck = 0
               vor = 0
               links = 0
               rechts = 1
            Case 2
               ruck = 0
               vor = 1
               links = 0
               rechts = 0
            Case 3
               ruck = 0
               vor = 0
               links = 1
               rechts = 0
            Case 4
               ruck = 0
               vor = 0
               links = 0
               rechts = 0
            End Select
            yy# = vor - ruck
            xx# = rechts - links
            TranslateEntity mesh(i),xx/10,0,yy/10
         Else
            Lebn(i) = Lebn(i) + 0.24
            If Lebn(i) > 100 Then Lebn(i) = 100:tot(i) = 0:PositionEntity mesh(i),10+Rand(-4,5),1.75,10+Rand(-4,5):ShowEntity mesh(i)
         EndIf 
      EndIf
   Next
   UpdateWorld()
   RenderWorld()
   Text 1,1,FPS
   For i = 0 To p_anz
      Text 1,13+i*13,i+".: "+Int(Lebn(i))+" / "+tot(i)+ " / "+rich(i)+" / "+DeltaYaw(mesh(i),mesh(0))
   Next
   WaitTimer(timer)
   Flip
   Cls
   FPS_COUNT = FPS_COUNT + 1
Until KeyHit(1)
End


(Und für die Leute die sich das ganze mal in aktion erleben wollen ^^ : DOAWNLOAD der Dateien + exe/code)

1.: Ist das bei euch auch so ?
2.: Woran könnte es liegen ?
3.: (Normalerweise drehen sich die Leute auch in die Laufrichtung, hb ich aber rausgenommen...

mfg Crack93
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
 

Dreamora

BeitragSa, Mai 10, 2008 11:18
Antworten mit Zitat
Benutzer-Profile anzeigen
woran könnts wohl liegen: weiss nicht, 4 * linepick * anzahl KI gegner?
Das ist eine der rechenintensivsten Befehle und das schon ohne das man die wohl grauenvollste Idee für 3D Spieleentwicklung mit reinzieht wie du, nämlich die Geometriepipeline mit tausenden Miniwürfelchen zu verstopfen und dann auch noch grössenwahnsinnigerweise meinen man könne die alle Picken ...

no chance, sorry.

Da musst du dich definitiv erst mal mit den Grundlagen von effizienter 3D Programmierung in Blitz3D auseinander setzen, am besten bevor du wieder LinePick für mehr als einige wenige Picks pro Frame nutzt! (das ist noch das andere problem, du pickst die ganze zeit, anstatt timed so das ein Agent nur alle XY ms guckt)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

ToeB

BeitragSa, Mai 10, 2008 12:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, danke erstmal Rolling Eyes ...

Aber wie kann ich sonst prüfen, ob der Gegner vor ne Wand läuft oder nicht ?

oder wie kann ich sonst so eine KI machen ?

mfg Crack93
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

peacemaker

BeitragSa, Mai 10, 2008 13:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, ob der Gegner die Wand berührt kannst du sehr einfach mit simplen Kollisionsbefehlen schreiben. Du musst z.B. so Zäune setzen, und dann prüfst du, ob das AI-Objekt den Zaun verlassen hat. So etwas könntest du mit einem simplen Befehl wie z.B. RectsOverlap benutzen. Das würde sich aber nur eignen, wenn sich das ganze auf einer flachen Ebene abspielt.

Und sonst: ich würde dir nicht anraten die Sicht der Gegner mit LinePick oder sowas zu machen. d.H. ja, das Gegner sehen können. Ich machs so, das ich Distanz sowie Winkel prüfe.

Wenn du ein komplexeres Spiel bzw. Ai machst, wo AI-Objekte auf andere Ai-Objekte reagieren müssen, müsstest du das optimieren.

Hast du jetzt z.B. 100 NPCs im Spiel, müsstest du ja immer pro NPC-Durchgang, alle anderen NPCs durchgehen und Distanz und Winkel prüfen. Hier kannst du eine art "Glocke" um den Spieler machen, sodass nur die NPCs die darin sind, geprüft werden.

mfG
~Tehadon~
www.tehadon.de
http://www.blitzforum.de/worklogs/14/
 

Dreamora

BeitragSa, Mai 10, 2008 13:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Indem die KI Pfaden folgt die du vorher entweder definierst oder die von deinem Level Editor beim exportieren ins finale Levelformat errechnet werden. Aber sicher nicht zu echtzeit und schon garnicht mit derart extrem unoptimierter Geometrie. So einen Ansatz kannst du machen wenn du die geometrie intelligent aufgebaut hast bzw. BSP Level benutzt.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Blackside

BeitragSa, Mai 10, 2008 13:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Vll. könntest du auch mit Countcollisions überprüfen ob die Gegner mit mehr als 1 Sache kollidieren
Code: [AUSKLAPPEN]
If Countcollisions(gegner) > 1 then Drehen()

The_Nici

BeitragSa, Mai 10, 2008 16:35
Antworten mit Zitat
Benutzer-Profile anzeigen
EDIT: whooops, löschen bitte

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group