我计划使用计时器事件每秒触发一次(用于时钟应用程序)。
我可能错了,但我认为实际系统时间可能存在(非常轻微的)同步问题。例如,当实际系统时间毫秒为 500 而不是 0 时,计时器事件可能会触发(这意味着如果您愿意,秒数将部分“异相”)。
有没有办法将计时器事件与实时同步,或者在 AS3 中的一秒滴答声时触发某种系统时间事件?
另外,如果我将 Timer 设置为每 1000 毫秒触发一次,这是保证还是可以根据应用程序负载进行一些偏移?
这些可能是微不足道的问题,但我只是好奇。
谢谢。
我计划使用计时器事件每秒触发一次(用于时钟应用程序)。
我可能错了,但我认为实际系统时间可能存在(非常轻微的)同步问题。例如,当实际系统时间毫秒为 500 而不是 0 时,计时器事件可能会触发(这意味着如果您愿意,秒数将部分“异相”)。
有没有办法将计时器事件与实时同步,或者在 AS3 中的一秒滴答声时触发某种系统时间事件?
另外,如果我将 Timer 设置为每 1000 毫秒触发一次,这是保证还是可以根据应用程序负载进行一些偏移?
这些可能是微不足道的问题,但我只是好奇。
谢谢。
您可以使用Date获取当前时间。如果你真的想要,你可以尝试通过将它与 Date 返回的内容对齐来控制你的计时器抖动。我不确定这甚至会成为一个问题(当然,如果您的应用程序没有长时间运行,即使那样我也不确定错误会构建得太快)。
请注意,操作系统通常只能精确到几毫秒,如果您需要这种精确度,您可能需要做其他事情。
我只是想到了一种简单的方法,至少可以提高计时器的准确性。通过简单地减少 Timer 间隔,最大误差范围就会减少。
因此,将 Timer 设置为每 100 毫秒而不是 1000 毫秒触发一次会导致最大错误为 99 毫秒而不是 999 毫秒。因此,根据所需的精度/性能,可以调整这些值。
如果定时器频率必须保持 1 秒,我们可以创建一个临时初始化定时器,它以非常快的间隔(约 1 毫秒)触发。然后在每个滴答声中,我们都会跟踪当前时间和上一次时间。如果时间的秒数发生了变化(实际时钟发生了变化),那么我们可以在那一刻触发主定时器(1000 毫秒)。这将确保 1 秒计时器在实时秒数变化时启动(以个位数毫秒而不是 3 位数毫秒出现错误)
当然,再一次,从检测到时间变化到计时器启动之间会有一些延迟。但是至少可以在保留1s的Timer的同时提高精度。
我将在这周的某个时间尝试一下并报告。
不幸的是,我不认为 Timer 可以保证保持相同的速度。它很可能会在一段时间内漂移(例如,如果您将其设置为 1000 毫秒,它可能会每 990 毫秒触发一次,这是一个非常小的差异,但随着时间的推移它会加起来)。我认为你应该按照你说的做,每 100 毫秒左右触发一次,然后检查 Date 对象以确定是否已经过了一秒钟。