0

我正在尝试找到一个关于在 ios 中测量时间的可靠解决方案。我想以 1 秒的精度显示时间的流逝。完全像 ios 内置的秒表,但只有几秒钟。到目前为止,我发现的每个解决方案似乎都很笨拙,因为它要么在 NStimer 的帮助下使用轮询,要么使用一些爱级别 C 的东西。我的问题是,“我”每次都需要问系统,几点了。但是如果我应该依赖不确定的 NStimer,那么我的测量是非常不可靠的。没有从系统调用的委托方法可以更新我的时间吗?我想如果我将轮询的分辨率提高到 1 ns,那就没问题了。但是我应该如何使用低级 C 来实现它呢?

4

2 回答 2

1

iOS 设备每秒仅重绘显示 60 次(最大值),因此任何超出此范围的时间精度对用户都是不可见的。您可以使用 CADisplayLink 每帧时间呼叫您,每秒 60 次并忽略(返回)59 个呼叫。但是您仍然需要轮询其中一个时钟(不止一个)来检查显示速率和时钟之间的漂移。而且,如果您的代码在 UI 运行循环中执行的操作过于冗长,您可能会错过一帧,因此您也必须检查这一点。

于 2012-04-24T23:04:33.980 回答
1

我不确定你的目标是什么。我不知道您是否想要一种查询高分辨率时间的好方法,或者您是否希望系统给您回电。

如果是前者,这就是我用于高分辨率计时器的。

#import "mach/mach_time.h"

#define TICKS_TO_NANOS(_ticks_, _timebase_) (((_ticks_) * ((_timebase_).numer)) / ((_timebase_).denom))
#define NOW_IN_TICKS() (mach_absolute_time())
#define NOW_IN_NANOS(_timebase_) TICKS_TO_NANOS(NOW_IN_TICKS(), _timebase_)

如果是后者,那么您永远无法获得有保证的回调计时器。可能最一致的计时器回调将挂钩到 CADisplayLink,但如果您的图形方法花费太长时间,您可能无法获得一致的结果。

您可以尝试系统计时器,但也无法保证。

于 2012-04-24T23:48:52.850 回答