遊戲開發總會要用到timer,離不開定時器的使用。像界面須要定時去繪製更新界面,後端也須要來定時執行邏輯,驅動事件。條條道路通羅馬,就看你使用技巧好很差了。html
通常服務器都是10ms一個tick,地圖進程就在每一個tick時執行邏輯處理,例如檢查buff是否到期了,怪物是否該去攻擊或走路了。之前的項目老是遍歷整個列表,檢查每一個buff是否到期。可想而知,當列表長度大了,這裏會耗費很多計算,而這些倒是沒必要要的。固然優化方案也是有的,其中之一就是實用time wheel時間輪了。具體原理我就不囉嗦了,能夠參考引用資料linux
原理仍是很簡單,採用多層時間輪會好點。固然具體問題仍是具體分析,當須要大量定時器時,時間輪仍是不錯的。若是像玩家進程,只是少許須要的,可使用更簡單的方案。保存timer有序列表,每次添加,刪除完定時器,都保證列表有序,而後只需從列表中取出第一項出來,加入到系統的定時器等待,超時了又再取下一個。這樣就不須要定時tick去檢查了,同時也不會佔用多餘的cpu,節省了資源,並且實現也是很簡單的。像我在項目實施的,插入,刪除的複雜度都在O(n),但實際上N是很小的,因此能夠不需考慮性能問題。最後就是附上我基於skynet上的timer實現,用erlang實現的timewheel了^_^git
erlang time wheelgithub