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