Cocos2D 2.0提高了计划精度

时间:2012-08-08 15:45:17

标签: ios timer cocos2d-iphone

我的一个场景中有这一行:

[self schedule:@selector(storeValue:) interval:1.0/30.0];

storeValue非常基本且快速。它只是将层的位置存储在NSMutableArray上。我需要尽可能精确地调用这个storeValue,但是在进行一些测量之后,这些是在每个storeValue调用之间测量的间隔:

interval 0 = 0
interval 1 = 0.049962
interval 2 = 0.033345
interval 3 = 0.033332
interval 4 = 0.049994
interval 5 = 0.050050
interval 6 = 0.049968
interval 7 = 0.033998
interval 8 = 0.049331
interval 9 = 0.050015
interval 10 = 0.049979
interval 11 = 0.049999
interval 12 = 0.033357
interval 13 = 0.033307
interval 14 = 0.049997
interval 15 = 0.033322
interval 16 = 0.050317
interval 17 = 0.049743
interval 18 = 0.049973
interval 19 = 0.033322
interval 20 = 0.050024
interval 21 = 0.049975
interval 22 = 0.049987
interval 23 = 0.033316
interval 24 = 0.050038
interval 25 = 0.050149
interval 26 = 0.049852
interval 27 = 0.049989
interval 28 = 0.050011

因此,如您所见,该方法以各种间隔调用,而不是始终为0.03333(1/30)。

我试图从storeValue中删除所有代码,以查看调用storeValue的频率并获得相同的不规则时间。

最大的问题是:我应该怎样做才能提高进度精度?我应该使用NSTimer吗? GCD执行计划任务的任何其他方法?有什么建议吗?

感谢。

注意:我现在发现如果我把interval = 0,每个帧都会调用storeValue,这意味着1/60秒,精度很棒。好的,我可以创建一个逻辑来调用storeValue的一半时间但是很高兴知道为什么调度是如此不精确以及是否有办法改进它。

2 个答案:

答案 0 :(得分:1)

当您安排某些事情时,选择器和计时器频率将传递给Cocos2d sharedScheduler。然后sharedDirector在每个帧上调用[[Scheduler sharedScheduler] tick: dt];。如果计时器超过其阈值,则调度程序将调用您的选择器。

因此频率不能比主循环频率更精确(最大1/60,最小 - 取决于实际场景复杂度)。可能1/30通过阈值不完全在每个第二帧上,这就是为什么你没有精确的日志值。

我可以建议通过NSTimer在其他线程上调用您的选择器,而不使用Cocos2d调度程序。

答案 1 :(得分:0)

iOS不是Real-time operating system,因此您无法保证您的预定回调/ NSTimer /等。将在1/30秒内完成。此精度将始终根据操作系统处理的其他内容而有所不同。

但是,您可以使用每次回调之间传递的实际时间来解决这种缺乏一致性的问题。