2012-05-15 71 views
1

我測試了簡單的乒乓球比賽在這裏找到:https://github.com/shangaslammi/frp-pongGLUT鍵盤奇慢無比

的問題是,該鍵盤控制工作非常糟糕 - 鍵是奇慢無比,經常有幾秒鐘的延遲。我假設作者爲Windows編寫代碼是因爲他包含了一個.bat文件,所以這是一個特定於Linux的問題。

這是怎麼發生的?

我不確定是哪裏的問題會是,但這裏是文件Keyboard.hs:

import Data.Set (Set) 
import qualified Data.Set as Set 
import Graphics.UI.GLUT (Key(..), KeyState(..)) 

-- | Set of all keys that are currently held down 
newtype Keyboard = Keyboard (Set Key) 

-- | Create a new Keyboard 
initKeyboard :: Keyboard 
initKeyboard = Keyboard Set.empty 

-- | Record a key state change in the given Keyboard 
handleKeyEvent :: Key -> KeyState -> Keyboard -> Keyboard 
handleKeyEvent k Down = addKey k 
handleKeyEvent k Up = removeKey k 

addKey :: Key -> Keyboard -> Keyboard 
addKey k (Keyboard s) = Keyboard $ Set.insert k s 

removeKey :: Key -> Keyboard -> Keyboard 
removeKey k (Keyboard s) = Keyboard $ Set.delete k s 

-- | Test if a key is currently held down in the given Keyboard 
isKeyDown :: Keyboard -> Key -> Bool 
isKeyDown (Keyboard s) k = Set.member k s 

,並設置回調:

type KeyboardRef = IORef Keyboard 
type TimeRef  = IORef POSIXTime 
type AccumRef = TimeRef 
type PrevTimeRef = TimeRef 
type GameRef  = IORef (Rects, GameLogic) 

type CallbackRefs = (AccumRef, PrevTimeRef, KeyboardRef, GameRef) 

initCallbackRefs :: IO CallbackRefs 
initCallbackRefs = do 
    accum <- newIORef secPerTick 
    prev <- getPOSIXTime >>= newIORef 
    keyb <- newIORef initKeyboard 
    cont <- newIORef ([],game) 
    return (accum, prev, keyb, cont) 

-- | Update the Keyboard state according to the event 
handleKeyboard :: CallbackRefs -> KeyboardMouseCallback 
handleKeyboard (_, _, kb, _) k ks _ _ = modifyIORef kb (handleKeyEvent k ks) 

回答