OGRE Physik ruckelt

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: OGRE Physik ruckelt

Beitrag von Chimorin »

Das mit der CPU Auslastung ist merkwürdig, da habe ich auf die Schnelle keine Erklärung für.
Dx9 installiert?
Auf wie viel GHz läuft eine solche CPU?
Das es bei 30FPS ein wenig ruckelt oder unsauber laeuft ist normal, der Mensch erachtet 34 FPS als flüssig. Mehr wir dann als flüssiger wahrgenommen. Ich würde SetFrameRate() einfach ganz weglassen.
Mach dannnoch das:

Code: Alles auswählen

time = RenderWorld(time)
So bekommt die Engine die Zeit, die sie zum Berechnen des letzten Bildes gebraucht hat, als neue Physikzeit.

Edit: Habt ihr jetzt mal das WindowEvent() in eine Schleife gepackt?
Bild

- formerly known as Bananenfreak -
gem
Beiträge: 14
Registriert: 24.08.2014 18:04

Re: OGRE Physik ruckelt

Beitrag von gem »

Hallo Chimorin

Also DX9 ist installiert
Eine CPU läuft auf ca 2.3 GHZ
Ich habe bereits die SetFrameRate mal wegelassen allerdings kein ersichtliche Veränderung
Den Rückgabewert von RenderWorld() habe ich mal getestet da kommt eine Unregelmäßigkeit vor
Der Durchschnitt liegt bei 20ms doch ca jede 100mal kommt ein Wert über 100 der wahrscheinlich das ruckeln bei mir verursacht
Das WindowEvent() habe ich auch mal in die Schleife gepackt oder komplett weggelassen habe auch anstatt OpenWindowedScreen OpenScreen verwendet leider kam die unregelmäßigkeit immer wieder vor

Ich konnte das Problem nur soweit lösen in dem ich bei RenderWorld() einen Wert eingegeben habe
Zunächst dachte ich damit hätte ich das Problem behoben doch als ich neue Kollisionskörper hinzugefügt habe kam es immer wieder vor das er die Physik nicht berechnet hat und durch den Körper durchging zwar nicht immer aber manchmal

Also leider habe ich auch immer noch keine richtige Lösung gefunden allerdings ruckelt es nicht mehr ständig wenn ein Wert bei RenderWorld() eingegeben wird
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: OGRE Physik ruckelt

Beitrag von man-in-black »

mal so ins Blaue:

sind im Hintergrund irgendwelche (Viren-,...)Scanner im Einsatz?
(hab alles, kann alles, weiß alles!!^^)

Bild
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: OGRE Physik ruckelt

Beitrag von The_Dark_Zim-.- »

Ähm hab mal bei mir getestet...

SetFrameRate() scheint dreckig programmiert zu sein :angry:
Sobald ich das raus nehme fällt die CPU Last von ~50% auf ~5%...

So gehts ohne CPU-Last und die Frames passen auch ;)

Code: Alles auswählen

;init
InitEngine3D()
InitSprite()
InitKeyboard()

;enumeration
Enumeration
   #window
   #camera
   #sphere
   #sphere_mesh
   #sphere_material
   #sphere_texture
   #light
   #plane_mesh
   #plane
   #plane_material
   #plane_texture
EndEnumeration

;window
OpenWindow(#window,0,0,800,600,"")
OpenWindowedScreen(WindowID(#window),0,0,800,600)
;SetFrameRate(30)

;enable
EnableWorldCollisions(1)
EnableWorldPhysics(1)

;sphere
CreateSphere(#sphere_mesh,4)

CreateTexture(#sphere_texture,2,2)
StartDrawing(TextureOutput(#sphere_texture))
   Box(0,0,2,2,RGB(255,0,0))
StopDrawing()

CreateMaterial(#sphere_material,TextureID(#sphere_texture))

CreateEntity(#sphere,MeshID(#sphere_mesh),MaterialID(#sphere_material),0,5,0)
EntityPhysicBody(#sphere,#PB_Entity_SphereBody)

;plane
CreatePlane(#plane_mesh,30,30,1,1,1,1)

;Add3DArchive("C:\Dokumente und Einstellungen\Gabriel\Desktop",#PB_3DArchive_FileSystem)
;LoadTexture(#plane_texture,"test.jpg")
CreateTexture(#plane_texture,2,2)
StartDrawing(TextureOutput(#plane_texture))
   Box(0,0,2,2,RGB(255,255,255))
StopDrawing()
   
CreateMaterial(#plane_material,TextureID(#plane_texture))

CreateEntity(#plane,MeshID(#plane_mesh),MaterialID(#plane_material),0,0,0)
EntityPhysicBody(#plane,#PB_Entity_StaticBody)

;light
CreateLight(#light,RGB(255,255,0),45,100,0)

;camera
rotateX = -45
rotateY = 0
rotateZ = 0
moveCameraX = 0
moveCameraY = 0
moveCameraZ = 0

CreateCamera(#camera,0,0,100,100)
MoveCamera(#camera,0,40,40)

WorldShadows(#PB_Shadow_Modulative )

FrameTime = 1000/30 ; 1000ms / 30Frames

;loop
Repeat
  StartTime = ElapsedMilliseconds() ; ermittelt den aktuellen Wert
  
  ExamineKeyboard()
   If KeyboardPushed(#PB_Key_Right)
      ApplyEntityImpulse(#sphere,0.5,0,0)
   ElseIf KeyboardPushed(#PB_Key_Left)
      ApplyEntityImpulse(#sphere,-0.5,0,0)
   EndIf
   
   If KeyboardPushed(#PB_Key_Up)
      ApplyEntityImpulse(#sphere,0,0,-0.5)
   ElseIf KeyboardPushed(#PB_Key_Down)
      ApplyEntityImpulse(#sphere,0,0,0.5)
   EndIf
   
   If KeyboardPushed(#PB_Key_Pad8)
     rotateX -1
   ElseIf KeyboardPushed(#PB_Key_Pad2)
     rotateX +1
   EndIf
   
   If KeyboardPushed(#PB_Key_Pad6)
     rotateY -1
   ElseIf KeyboardPushed(#PB_Key_Pad4)
     rotateY +1
   EndIf
   
   If KeyboardPushed(#PB_Key_Pad9)
     rotateZ -1
   ElseIf KeyboardPushed(#PB_Key_Pad7)
     rotateZ +1
   EndIf

   
   If KeyboardPushed(#PB_Key_A)
     moveCameraX -1
   ElseIf KeyboardPushed(#PB_Key_D)
     moveCameraX +1
   EndIf
   
   If KeyboardPushed(#PB_Key_Q)
     moveCameraY -1
   ElseIf KeyboardPushed(#PB_Key_E)
     moveCameraY +1
   EndIf
   
   If KeyboardPushed(#PB_Key_W)
     moveCameraZ -1
   ElseIf KeyboardPushed(#PB_Key_S)
     moveCameraZ +1
   EndIf
   
   
   RotateCamera(#camera,rotateX,rotateY,rotateZ)
   MoveCamera(#camera,moveCameraX,moveCameraY,moveCameraZ)
   
   moveCameraX = 0
   moveCameraY = 0
   moveCameraZ = 0
   
   RenderWorld()
   FlipBuffers()
   
   ElapsedTime = ElapsedMilliseconds()-StartTime ; der 'ElapsedTime' Wert sollte ca. 1000 Millisekunden betragen
   If ElapsedTime < FrameTime
     Delay(FrameTime-ElapsedTime)
   EndIf
   
Until WindowEvent() = #PB_Event_CloseWindow
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: OGRE Physik ruckelt

Beitrag von Chimorin »

Das Durchfliegen ist mehr oder weniger normal. Die 3DEngine berechnet meines Glaubens nach nicht den Weg, den ein Entity nimmt, sondern die Endposition und überprüft dort auf Kollision. Das habe ich aber noch nicht getestet.

Ich bin mit meinem Latein so langsam am Ende. Ich kann dir aber noch helfen: Die Lichter, Entities, Gadgets, fenster,... haben jeweils eine eigene Liste, kommen deshalb jeweils in ein eigenes Enumerate.

EDIT VOR ABSENDEN:
Rätsels Lôsung ist, dass SetFrameRate die 30Fps macht und den Rest der Sekunde einfach wartet. Deshalb evtl dieses Ruckeln. Warum das aber nur bei euch auftritt ist merkwürdig.
Welches PB verwendet ihr? 5.3? Leider bin ich nicht zuhause, ich würde so gerne rumprobieren...
Bild

- formerly known as Bananenfreak -
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: OGRE Physik ruckelt

Beitrag von mk-soft »

Hab´s mal auf mein Mac probiert. Mit SetFrameRate fangen die Prozessoren an zu kochen.

Ohne SetFrameRate: Prozess etwa 8%
Mit SetFrameRate: Prozess etwa 67%

Vielleicht haben wir auch bei der Funktion etwas falsch verstanden.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: OGRE Physik ruckelt

Beitrag von Danilo »

mk-soft hat geschrieben:Hab´s mal auf mein Mac probiert. Mit SetFrameRate fangen die Prozessoren an zu kochen.

Ohne SetFrameRate: Prozess etwa 8%
Mit SetFrameRate: Prozess etwa 67%

Vielleicht haben wir auch bei der Funktion etwas falsch verstanden.
SetFrameRate soll ja die Framerate begrenzen, und das macht es sicherlich mit einer Schleife,
die immer wieder abfragt wann eine bestimmte Zeit in Millisekunden erreicht wurde.
Ich finde das somit nicht verwunderlich. Entweder man lässt es mit voller Framerate laufen
und macht Bewegungen/Animationen usw. zeitbasiert (das ist eigentlich die bevorzugte Methode,
denn ein Gamer, dessen PC z.B. 60 FPS schafft, möchte nicht künstlich auf 30 FPS begrenzt werden),
oder man baut sich selbst eine schonende Methode mit Delay(ms), so dass der Prozessor sich nicht
so schnell abnutzt. ;)
Die Methode mit Delay() ist allerdings nicht auf allen Systemen, und je nach Hardware, auf 1ms hin genau,
weshalb PB wohl das Polling verwendet. Also immer wieder in einer Schleife, ohne Pause, abfragen wann
die entsprechende Zeit erreicht wurde.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

Re: OGRE Physik ruckelt

Beitrag von Tommy »

Moin Danilo erstmal
Danilo hat geschrieben: Entweder man lässt es mit voller Framerate laufen und macht Bewegungen/Animationen usw. zeitbasiert (das ist eigentlich die bevorzugte Methode,
Kannst du mir die Vorteile nennen? Ich meine nicht das die CPU entlastet wird, gibt es andere Vorteile? Was hat man davon wenn man mit 200 FPS das Spiel spielen kann? Ob man mit 200 FPS oder mit 60 FPS macht es keinen Unterschied denn für das menschliche Auge ist schon ab 25 Frames flüssig und bei übertriebener Anzahl von 200 oder mehr kann ich mir keinen Vorteil vorstellen.
Danilo hat geschrieben:denn ein Gamer, dessen PC z.B. 60 FPS schafft, möchte nicht künstlich auf 30 FPS begrenzt werden),
Der sogenannte Gamer merkt davon eh nichts ob er mit 30 Frames oder 60 Frames spielt. Wo liegt der Unterschied? So lange das Spiel flüssig läuft ist es scheiß egal ob das Spiel nur mit 30 Frames läuft. Es ist nicht so als ob man mit 60 Frames bessere "Grafik" als mit 30 Frames hätte sondern gibt nur an wie viele Frames maximal angezeigt werden. Vorausgesetzt die Bewegungsanimationen sind nicht framesabhängig weil dann laufen die Animationen schneller ab wenn die FPS höher liegt. Aber die Frage ist was hat der Spieler davon wenn er mit höheren FPS spielen kann? 30 Fraes reichen auch aus oder?
Zuletzt geändert von Tommy am 27.01.2015 10:55, insgesamt 2-mal geändert.
PB 5.41 x64
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: OGRE Physik ruckelt

Beitrag von NicTheQuick »

Man merkt schon einen Unterschied, wenn das Spiel mit 60 FPS läuft im Gegensatz zu 30 FPS. Der Mensch kann die Zwischenframes zwar nicht einzeln erkennen, aber da die zusätzliches Frames dann sozusagen "verwischen", erscheint jede Bewegung trotzdem etwas flüssiger. Ähnlich dem extra berechneten Motionblur bei 3D-Kinofilmen.
Hast du zufällig "Der Hobbit" in 3D mit 48 FPS im Kino gesehen? Das war ein gewaltiger Unterschied zu den sonst üblichen 24 FPS. Es erschien alles viel flüssiger.
Ansonsten empfiehlt sich natürlich zumindest eine Framerate zu nutzen, die ein Teiler der Wiederholrate des Monitors ist. Aber ein VSync macht das ja auch automatisch.
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

Re: OGRE Physik ruckelt

Beitrag von Tommy »

@NickTheQuick
Ok bis 60 Frames bin ich noch dabei und ist in vielen Spielen standard aber wie ist es mit 200 Frames? 200 Frames sind übertrieben viel. Ab gewisser FPS merkt man keinen Unterschied oder? 30 auf 60 ok aber auf 200 FPS? Die Bewegung bei 60 FPS schon sehr flüssig und flüssiger als bei 30 FPS aber 200 FPS ist es noch flüssiger? Irgendwann muss das Ende für das menschliche Auge erreicht sein oder? Wie lautet den deine Meinung zu 200 FPS? Findest du auch dass 200 FPS noch besser unf flüssiger sind?
Zuletzt geändert von Tommy am 27.01.2015 10:54, insgesamt 2-mal geändert.
PB 5.41 x64
Antworten