Skip to content

Instantly share code, notes, and snippets.

@simonmichael
Forked from anonymous/gist:658844
Created November 1, 2010 20:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save simonmichael/658846 to your computer and use it in GitHub Desktop.
Save simonmichael/658846 to your computer and use it in GitHub Desktop.
-- frame-based animation, SDL
mainloop1 :: Game -> IO ()
mainloop1 game@Game{fpsmgr=fpsmgr,time=t0} = do
t1 <- SDL.getTicks
game' <- handleEvents game
let game'' = step game'
t2 <- SDL.getTicks
sdlRender game''
t3 <- SDL.getTicks
Framerate.delay $ fpsmgr
t4 <- SDL.getTicks
sdlFlip
t5 <- SDL.getTicks
let rate = 1000 / fromIntegral (t5-t0)
when debug $ printf "times & frame rate: render %4d delay %4d flip %4d frame %4d %4.0f\n" (t3-t2) (t4-t3) (t5-t4) (t5-t0) (rate::Double)
unless (over game'') $ mainloop game''{time=t5}
-- frame-based animation, GL
mainloop2 :: Game -> IO ()
mainloop2 Game{over=True} = return ()
mainloop2 game@Game{fpsmgr=fpsmgr,time=t0} = do
t1 <- SDL.getTicks
game' <- handleEvents game
let game'' = step game'
t2 <- SDL.getTicks
glRender game''
t3 <- SDL.getTicks
Framerate.delay $ fpsmgr
t4 <- SDL.getTicks
glFlip
t5 <- SDL.getTicks
let rate = 1000 / fromIntegral (t5-t0)
when debug $ printf "times & frame rate: render %4d delay %4d flip %4d frame %4d %4.0f\n" (t3-t2) (t4-t3) (t5-t4) (t5-t0) (rate::Double)
mainloop game''{time=t1}
-- time based animation, GL
mainloop3 :: Game -> IO ()
mainloop3 Game{over=True} = return ()
mainloop3 game@Game{fpsmgr=fpsmgr,time=t0} = do
t1 <- SDL.getTicks
game' <- handleEvents game
let steptime = 1000 `div` gamerate
frametime = min (t1-t0) 50
(numsteps,remainder) = (frametime `div` steptime, frametime `mod` steptime)
game'' = stepN numsteps step game'{time=t1-remainder}
-- when debug $ printf "frametime %4d steps %4d remainder %4d\n" frametime (frametime `div` steptime) (frametime `mod` steptime)
when (numsteps > 0) $ do
-- do
-- t2 <- SDL.getTicks
glRender game''
-- t3 <- SDL.getTicks
Framerate.delay $ fpsmgr
-- t4 <- SDL.getTicks
glFlip
t5 <- SDL.getTicks
let rate = 1000 / fromIntegral (t5-t0)
-- when debug $ printf "times & frame rate: render %4d delay %4d flip %4d frame %4d %4.0f\n" (t3-t2) (t4-t3) (t5-t4) (t5-t0) (rate::Double)
when debug $ printf "times & frame rate: frame %4d %4.0f\n" (t5-t0) (rate::Double)
mainloop game''
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment