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