Re: [問題] 軟體中 => 時間中斷

看板C_and_CPP作者 (殺人貓™)時間9年前 (2014/12/25 13:42), 9年前編輯推噓2(200)
留言2則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《a22326284 (chin)》之銘言: 遊戲程式基本上很少會「定一秒」的 因為開timing thread既沒效率也會造成設計上的困擾 正常的作法都是用一個infinite loop去做整個遊戲的驅動 這在遊戲設計裡面有個專有名詞叫update loop(或者Game loop) 大致上長得像這樣 bool running = true; double lastUpdatetime = getPreciousTime(); //拿準確時間在C++11以前是個平台不同 //C++11以後可以用chrono來拿到毫秒 while(running) { double currentTime = getPreciousTime(); running = update(currentTime - lastUpdateTime); //記得要處理0的問題 lastUpdateTime = currentTime; } 這是普通遊戲的寫法。所謂一秒是什麼意思呢? 我們update吃double,單位吃millisecond 所以一秒就是在update裡面設一個10000的倒數計時 bool isTimeExpired(double timer) { countdown -= timer; return countdown < 0; } 也就是說每次update都減掉update近來的毫秒數,直到countdown小於零就是時間到 當然這會有明顯的缺點,就是他不太準(不過在普通來講也夠準確了) 真正要拿準確的一秒的話可以用Timer thread的library 通常跨平台的timer thread都是用fd去實作的(你沒看錯 就是async socket的fd) 在Linux新的sdk裡面甚至把他幫你包了一層叫做timerfd的東西 連thread callback的問題都幫你處理好了,非常便利 http://man7.org/linux/man-pages/man2/timerfd_create.2.html 不過遊戲中不需要準確到這種。Windows的話還多了一個拿CPU tick的可以用 http://msdn.microsoft.com/en-us/library/windows/desktop/ms724408(v=vs.85).aspx 這個拿的也是絕對準確的時間,只是你要自己處理timing thread的問題 拿準確時間並且callback在遊戲中其實是一個非常消耗資源的行為 正常來講我們並不建議你們這樣做 C++11目前有chrono可以拿精確時間,如果你用C++11的話 這是一個比較ok的跨平台解決方案 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.124.251.135 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1419486163.A.3F1.html ※ 編輯: Killercat (59.124.251.135), 12/25/2014 16:39:31

12/26 01:24, , 1F
感謝高手的回覆 我再仔細研究看看 謝謝!!!
12/26 01:24, 1F

01/09 23:34, , 2F
1000毫秒吧
01/09 23:34, 2F
文章代碼(AID): #1KcwFJFn (C_and_CPP)
文章代碼(AID): #1KcwFJFn (C_and_CPP)