1

我的一个场景中有这句话:

[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 还有其他执行计划任务的方法吗?有什么建议么?

谢谢。

注意:我现在发现如果我设置间隔 = 0,storeValue 将在每一帧被调用,这意味着 1/60 秒并且精度非常好。好的,我可以制定一个逻辑来调用 storeValue 一半的时间,但很高兴知道为什么调度如此不精确以及是否有办法改进它。

4

2 回答 2

1

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

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

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

于 2012-08-09T07:33:08.080 回答
0

iOS 不是实时操作系统,因此您永远无法保证您的预定回调/NSTimer/等。将永远发生在精确的 1/30 秒内。此精度将始终根据操作系统正在处理的其他内容而有所不同。

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

于 2012-08-09T05:03:21.370 回答