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

![]() |
ToeBBetreff: [B3D] Plötzlicher FPS verlust... !? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Okay, danke erstmal ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vll. könntest du auch mit Countcollisions![]() Code: [AUSKLAPPEN] If Countcollisions(gegner) > 1 then Drehen()
|
||
![]() |
The_Nici |
![]() Antworten mit Zitat ![]() |
---|---|---|
EDIT: whooops, löschen bitte | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group