Constant Framerate
Tweet blitz3d frame-rate code-archives miscellaneous tutorials
Constant frame rate taken from castle demo.
;From Mark Sibly's castle demo
Graphics3D 640,480,0,2
Const FPS=30
period=1000/FPS
time=MilliSecs()-period
While Not KeyHit(1)
Repeat
elapsed=MilliSecs()-time
Until elapsed
;how many 'frames' have elapsed
ticks=elapsed/period
;fractional remainder
tween#=Float(elapsed Mod period)/Float(period)
For k=1 To ticks
time=time+period
If k=ticks Then CaptureWorld
UpdateGame()
UpdateWorld
Next
RenderWorld tween
Flip
Wend
Function UpdateGame()
Text 10,10,"FPS: "+FPS
Text 10,30,"period: "+period
Text 10,50,"time: "+time
Text 10,70,"elapsed: "+elapsed
Text 10,90,"ticks: "+ticks
Text 10,110,"tween: "+tween
End Function
another example :
;Speed of the turns/moves/animations automatically adjusted to appear constant whatever the FPS
;
;This code shows a way to have an automatic adjustment of the speed of the turns/moves/animations
;so that the program appears to run at the same speed, whatever the FPS, whatever is drawn on screen, whatever the hardware of the computer/graphics card.
;The variable SpeedCoeff# must be applied to all turns/moves/animations. See the example.
;I have tested this code on several computers with different hardwares and os and it seems to work as expected.
;There may be inaccuracies if there is less than 10fps but overall it works well.
Global ProgramState%
Const CStart% = 1
Const CUpdate% = 2
Const CEnd% = 3
ProgramState = CStart
Graphics3D(800,600,32,2)
HidePointer()
SeedRnd(MilliSecs())
Global Origine = CreateCube()
ScaleMesh(Origine,0.1/2,0.1/2,0.1/2)
EntityColor(Origine,125,000,125)
EntityAlpha(Origine,0.5)
EntityFX(Origine,1)
PositionEntity(Origine,0,0,0,True)
Global Target = CreateCube()
ScaleMesh(Target,0.1/2,100.0,0.1/2)
EntityColor(Target,250,000,250)
EntityAlpha(Target,0.5)
EntityFX(Target,1)
PositionEntity(Target,0,0,128.0,True)
GroundMesh = CreatePlane()
EntityColor(GroundMesh,125,125,125)
PositionEntity(GroundMesh,0,0,0)
Global Camera = CreateCamera()
CameraRange(Camera,0.1,1000)
CameraViewport(Camera,0,0,GraphicsWidth(),GraphicsHeight())
CameraClsColor(Camera,000,000,000)
XCharacterMesh = CreateCube()
ScaleMesh(XCharacterMesh,0.5/2,1.75/2,0.25/2)
PositionMesh(XCharacterMesh,0,1.75/2,0)
HideEntity(XCharacterMesh)
Global PlayerFeet = CreatePivot()
Global PlayerEyes = CreatePivot()
MoveEntity(PlayerEyes,0,1.65,0)
EntityParent(PlayerEyes,PlayerFeet,True)
Global PlayerMesh = CopyEntity(XCharacterMesh)
EntityColor(PlayerMesh,000,000,250)
EntityParent(PlayerMesh,PlayerFeet,True)
Global BotsCount% = 0
Dim BotFeet(10000)
Dim BotMesh(10000)
For n% = 1 To 2000 ;change this value to 1 or 10 or 100 or 1000 or more
BotsCount = BotsCount + 1
I% = BotsCount
BotFeet(I) = CreatePivot()
BotMesh(I) = CopyEntity(XCharacterMesh)
EntityColor(BotMesh(I),Rand(025,250),Rand(025,250),Rand(025,250))
EntityParent(BotMesh(I),BotFeet(I),True)
PositionEntity(BotFeet(I),Rnd(-30,30),0,Rnd(10,90),True)
RotateEntity(BotFeet(I),0,Rnd(-180,180),0,True)
Next
DLight = CreateLight(1)
LightColor(DLight,255,255,255)
PositionEntity(DLight,0,1000,-1000,True)
RotateEntity(DLight,45,0,0,True)
AmbientLight(064,064,064)
TurnEntity(PlayerEyes,22.5,0,0)
;to count the millitime it takes for player to from the start point to the target point
Global TravelMilliStart% = MilliSecs()
Global TravelMilliTime%
;to count the millitime a mainloop takes
Global MainLoopMilliStart%
Global MainLoopMilliTime%
;to lock the FPS at 30fps maximum
Global MainLoopTimer = CreateTimer(30)
;to count the number of frames per second
Global FPS%
;the value to apply to all turns/moves/animations so that the speed of the turns/moves/animations appear constant whatever the FPS, whetever is drawn on the screen
Global SpeedCoeff# = 1.0
ProgramState = CUpdate
Main()
EndGraphics()
End()
Function Main()
Repeat
MainLoopMilliStart = MilliSecs()
UpdateBots()
UpdatePlayer()
If( EntityZ(PlayerFeet,True) >= EntityZ(Target,True) )
ClsColor(000,000,000) : Cls()
Locate(0,0)
Print("Total time passed during the travel = "+Int(Float(TravelMilliTime)/1000)+"seconds")
FlushKeys()
WaitKey()
ProgramState = CEnd
EndIf
TravelMilliTime = MilliSecs() - TravelMilliStart
;position/rotate the camera before the rendering of the scene
PositionEntity(Camera,EntityX(PlayerEyes,True),EntityY(PlayerEyes,True),EntityZ(PlayerEyes,True))
RotateEntity(Camera,EntityPitch(PlayerEyes,True),EntityYaw(PlayerEyes,True),EntityRoll(PlayerEyes,True))
MoveEntity(Camera,0,0,-1.5)
CameraViewport(Camera,0,0,GraphicsWidth(),GraphicsHeight())
CameraClsColor(Camera,000,000,000)
SetBuffer(BackBuffer())
RenderWorld()
For n% = 1 To 10 Step 1 ;change this value to 1 or 10 or 100 or more
PWidth% = Rand(25,100) : PHeight% = Rand(16*1,16*10)
PX% = Rand(0+1,GraphicsWidth()-PWidth-1) : PY% = Rand(0+1,GraphicsHeight()-PHeight-1)
Color(Rand(025,255),Rand(025,255),Rand(025,255)) : Rect(PX,PY,PWidth,PHeight,True)
Next
Color(255,255,255)
Text(0,0,"Triangles = "+TrisRendered())
Text(0,16,"MainLoopMilliTime = "+MainLoopMilliTime)
Text(0,32,"FPS = "+FPS)
Text(0,48,"SpeedCoeff = "+SpeedCoeff)
Text(0,64,"Current time of the travel = "+Int(Float(TravelMilliTime)/1000)+"seconds")
Text(0,80,"See how the speed of the turns/moves/animations are automatically adjusted so that ")
Text(0,96,"it appears to run at the same speed, whatever the FPS, whatever is drawn on screen.")
;Flip(true)
WaitTimer(MainLoopTimer)
VWait():Flip(False)
MainLoopMilliTime = MilliSecs() - MainLoopMilliStart
If(MainLoopMilliTime < 1)
MainLoopMilliTime = 1
EndIf
SpeedCoeff = Float(30) / 1000 * MainLoopMilliTime
FPS% = 1000.0/MainLoopMilliTime
Until( KeyDown(1)=1 Or ProgramState = CEnd )
End Function
Function UpdatePlayer()
MoveEntity(PlayerFeet,0,0,0.2*SpeedCoeff)
End Function
Function UpdateBots()
For I% = 1 To BotsCount
TurnEntity(BotFeet(I),0,2.0*SpeedCoeff,0)
MoveEntity(BotFeet(I),0,0,0.2*SpeedCoeff)
Next
End Function
Reply To Topic (minimum 10 characters)
Please log in to reply