Use system sleep functions as threadDelay sleep to long without -threaded
This commit is contained in:
parent
c0d2d54ea1
commit
d6b28723a2
5 changed files with 17 additions and 4 deletions
|
@ -20,6 +20,7 @@ module Bindings.GLX ( createColormap
|
||||||
, makeCurrent
|
, makeCurrent
|
||||||
, destroyContext
|
, destroyContext
|
||||||
, swapBuffers
|
, swapBuffers
|
||||||
|
, glxUsleep
|
||||||
, Context(..)
|
, Context(..)
|
||||||
, Drawable
|
, Drawable
|
||||||
) where
|
) where
|
||||||
|
@ -41,6 +42,7 @@ import Graphics.X11.Xlib.Types (Dimension, Display, Pixel, Position)
|
||||||
|
|
||||||
|
|
||||||
#include <GL/glx.h>
|
#include <GL/glx.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
|
||||||
type Drawable = XID
|
type Drawable = XID
|
||||||
|
@ -263,3 +265,6 @@ foreign import ccall unsafe "GL/glx.h glXDestroyContext"
|
||||||
|
|
||||||
foreign import ccall unsafe "GL/glx.h glXSwapBuffers"
|
foreign import ccall unsafe "GL/glx.h glXSwapBuffers"
|
||||||
swapBuffers :: Display -> Drawable -> IO ()
|
swapBuffers :: Display -> Drawable -> IO ()
|
||||||
|
|
||||||
|
foreign import ccall unsafe "unistd.h usleep"
|
||||||
|
glxUsleep :: CULong -> IO ()
|
||||||
|
|
|
@ -16,7 +16,7 @@ tankLength :: Micro
|
||||||
tankLength = 0.95
|
tankLength = 0.95
|
||||||
|
|
||||||
bulletDiameter :: Micro
|
bulletDiameter :: Micro
|
||||||
bulletDiameter = 0.1
|
bulletDiameter = 0.05
|
||||||
|
|
||||||
collisionTankBorder :: Micro -> Micro -> Tank -> Tank
|
collisionTankBorder :: Micro -> Micro -> Tank -> Tank
|
||||||
collisionTankBorder lw lh tank = tank {tankX = newx, tankY = newy}
|
collisionTankBorder lw lh tank = tank {tankX = newx, tankY = newy}
|
||||||
|
|
|
@ -24,6 +24,8 @@ class Driver a where
|
||||||
|
|
||||||
swapBuffers :: a -> IO ()
|
swapBuffers :: a -> IO ()
|
||||||
|
|
||||||
|
usleep :: a -> Integer -> IO ()
|
||||||
|
|
||||||
nextEvent :: a -> IO (a, Maybe SomeEvent)
|
nextEvent :: a -> IO (a, Maybe SomeEvent)
|
||||||
|
|
||||||
data SomeDriver = forall d. Driver d => SomeDriver d
|
data SomeDriver = forall d. Driver d => SomeDriver d
|
||||||
|
@ -34,6 +36,7 @@ instance Driver SomeDriver where
|
||||||
deinitGL (SomeDriver d) = deinitGL d
|
deinitGL (SomeDriver d) = deinitGL d
|
||||||
swapBuffers (SomeDriver d) = swapBuffers d
|
swapBuffers (SomeDriver d) = swapBuffers d
|
||||||
nextEvent (SomeDriver d) = nextEvent d >>= \(gl, ev) -> return (SomeDriver gl, ev)
|
nextEvent (SomeDriver d) = nextEvent d >>= \(gl, ev) -> return (SomeDriver gl, ev)
|
||||||
|
usleep (SomeDriver d) = usleep d
|
||||||
|
|
||||||
|
|
||||||
class (Typeable a, Show a) => Event a
|
class (Typeable a, Show a) => Event a
|
||||||
|
|
|
@ -105,6 +105,8 @@ instance Driver GLX where
|
||||||
swapBuffers glx = Bindings.GLX.swapBuffers (glxDisplay glx) (glxWindow glx)
|
swapBuffers glx = Bindings.GLX.swapBuffers (glxDisplay glx) (glxWindow glx)
|
||||||
|
|
||||||
nextEvent glx = allocaXEvent $ nextEvent' glx
|
nextEvent glx = allocaXEvent $ nextEvent' glx
|
||||||
|
|
||||||
|
usleep _ usecs = glxUsleep $ fromIntegral usecs
|
||||||
|
|
||||||
|
|
||||||
nextEvent' :: GLX -> XEventPtr -> IO (GLX, Maybe SomeEvent)
|
nextEvent' :: GLX -> XEventPtr -> IO (GLX, Maybe SomeEvent)
|
||||||
|
|
|
@ -21,6 +21,9 @@ import qualified Data.Map as M
|
||||||
import qualified Data.Set as S
|
import qualified Data.Set as S
|
||||||
import Data.Time
|
import Data.Time
|
||||||
|
|
||||||
|
import Foreign.C.Types
|
||||||
|
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = do
|
main = do
|
||||||
let theLevel = testLevel
|
let theLevel = testLevel
|
||||||
|
@ -45,7 +48,7 @@ main = do
|
||||||
deinitGL gl
|
deinitGL gl
|
||||||
|
|
||||||
minFrameTime :: NominalDiffTime
|
minFrameTime :: NominalDiffTime
|
||||||
minFrameTime = 0.01
|
minFrameTime = 0.02
|
||||||
|
|
||||||
mainLoop :: Main ()
|
mainLoop :: Main ()
|
||||||
mainLoop = do
|
mainLoop = do
|
||||||
|
@ -60,9 +63,10 @@ mainLoop = do
|
||||||
rtime <- liftIO getCurrentTime
|
rtime <- liftIO getCurrentTime
|
||||||
let drender = diffUTCTime rtime t
|
let drender = diffUTCTime rtime t
|
||||||
when (drender < minFrameTime) $
|
when (drender < minFrameTime) $
|
||||||
liftIO $ threadDelay $ truncate $ 1e6*(minFrameTime - drender)
|
liftIO $ usleep gl $ truncate $ 1e6*(minFrameTime - drender)
|
||||||
|
|
||||||
currenttime <- liftIO getCurrentTime
|
currenttime <- liftIO getCurrentTime
|
||||||
|
liftIO $ print $ diffUTCTime currenttime rtime
|
||||||
let d = round $ 1e2*(diffUTCTime currenttime t)
|
let d = round $ 1e2*(diffUTCTime currenttime t)
|
||||||
|
|
||||||
replicateM_ d simulationStep
|
replicateM_ d simulationStep
|
||||||
|
@ -74,7 +78,6 @@ mainLoop = do
|
||||||
runnext <- gets run
|
runnext <- gets run
|
||||||
when runnext mainLoop
|
when runnext mainLoop
|
||||||
|
|
||||||
|
|
||||||
handleEvents :: Main ()
|
handleEvents :: Main ()
|
||||||
handleEvents = do
|
handleEvents = do
|
||||||
(newgl, event) <- gets driver >>= liftIO . nextEvent
|
(newgl, event) <- gets driver >>= liftIO . nextEvent
|
||||||
|
|
Reference in a new issue