※ 引述《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的跨平台解決方案