【发布时间】:2012-10-09 20:24:16
【问题描述】:
我正在使用CADisplayLink 来执行声音和动画之间的同步。同步需要非常精确,并且当前在 frameInterval of 1 处运行的 CADisplayLink 调用选择器的频率不够。
有没有办法增加它的粒度? (frameInterval 是一个整数属性,所以我显然不能低于 1)
【问题讨论】:
标签: ios ios5 core-animation cadisplaylink
我正在使用CADisplayLink 来执行声音和动画之间的同步。同步需要非常精确,并且当前在 frameInterval of 1 处运行的 CADisplayLink 调用选择器的频率不够。
有没有办法增加它的粒度? (frameInterval 是一个整数属性,所以我显然不能低于 1)
【问题讨论】:
标签: ios ios5 core-animation cadisplaylink
老问题,但它提出了有趣的观点,所以我会给我的 2 美分。
正如documentation所说,
A CADisplayLink object is a timer object that allows your application to synchronize its drawing to the refresh rate of the display.
因此,您将无法获得超过每秒 60 次的更新频率,即 LCD 屏幕显示速率。动画本身没有刷新率,它们代表一个连续的运动,每次屏幕更新时恰好可见。
我对声音播放没有太多经验,但我很惊讶CADisplayLink 刷新率不够。 1/60 秒对用户的耳朵真的有影响吗?
也许您用于声音播放的方法会导致某种滞后?
无论如何,如果您想将声音与动画更精细地同步,我建议您设置 NSTimer 并设置适合您的重复间隔,而不是 CADisplayLink。
你需要的其他东西是:
CACurrentMediaTime() 函数,返回 Core Animation 在调用时使用的时间CAAnimation 的beginTime 属性(从CAMediaTiming 协议中获取)将beginTime 设置为CACurrentMediaTime 的偏移量将允许您创建以非常精确和可控的时间开始的动画。如果在向图层添加动画时将其保留为 0(默认值),则会在运行循环结束时自动将其设置为 CACurrentMediaTime,从而导致控制时间较少。
您还可以从正在运行的CAAnimation 中读取beginTime,以了解它开始的确切时间,这可能不是您将其添加到层的确切时间(见上文)。
【讨论】: