我看火烈鸟的书:<<cocos2d-x 高级开发教程 制作自己的"捕鱼达人">>.书里面讲到定时器事件,关于schedule定时器,有一句话:
“由于引擎的调度机制,这里的时间间隔必须大于两祯的间隔,否则两祯期间的多次调用会被合并成一次调用.”
这句话,我就不明白了,是不是cocosd-x的定时器,我想要每隔0.0013秒触发一次,实际结果,会修正一次?例如,并不是严格按照每0.0013秒跑一次,而是修正到某个间隔内呢?如果是这样的话,cocos2d-x的开发人员这样做的出发点又是为什么呢?
为了测试,我分别写了一个桌面程序,使用NSTimer来调度;另一个cocos2d-x的程序,使用Schedule来调度.发现结果比较有意思.
//桌面程序
-(IBAction)onBtn:(id)sender {
;
}
b2Timer g_timer;
float g_dt = 0;
- (void)onTimer:(NSTimer *)timer {
float tmp = g_timer.GetMilliseconds();
printf("%f\n", tmp - g_dt);
g_dt = tmp;
}
```
它打印的结果是:
998.987305
1000.977051
999.971680
999.967285
999.989746
999.930664
999.941406
1000.012695
//cocos2d-x的程序
bool HelloWorld::init() {
schedule(schedule_selector(HelloWorld::onTimer), 1);
return true;
}
float g_dt = 0;
b2Timer g_timer;
void HelloWorld::onTimer(float dt) {
float tmp = g_timer.GetMilliseconds();
printf("%f\n", tmp - g_dt);
g_dt = tmp;
}
```
它打印的结果是:
1016.500000
1016.500000
1016.500000
1000.500000
1016.500000
1016.000000
1016.500000
1000.500000
1016.500000
1016.500000
感觉桌面程序NSTimer的定时器差不多都是在1秒内触发的.
而cocos2d-x的schedule却没有严格按照我预想的1秒内触发一次.
而是会修正到1016豪秒.
而16豪秒的差距刚好符合祯率: 1/60 = 0.01666666
感觉它会修正到祯刷新的时间点上来进行?
不知道开发者是出于什么想法这样做的?
这样做法,会不会导致一种情形,就是:我想每隔2秒派一次金币,1小时后,玩家本应得1800,结果最终玩家才得到1760个????