0

CADisplayLink用来执行声音和动画之间的同步。同步需要非常精确,并且当前CADisplayLinkframeInterval1 运行并不能足够频繁地调用选择器。

有没有办法增加它的粒度?(frameInterval是一个整数属性,所以我显然不能低于 1)

4

1 回答 1

0

老问题,但它提出了有趣的观点,所以我会给我 2 美分。

文档所述,

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 在它被调用时使用的时间
  • theCAAnimationbeginTime属性(它从CAMediaTiming协议中获得)

设置beginTime为偏移量CACurrentMediaTime将允许您创建以非常精确和受控的时间开始的动画。如果将动画添加到图层时将其保留为 0(默认值),它将CACurrentMediaTime在 runloop 结束时自动设置为 ,从而导致控制时间较少。

您还可以beginTime从运行中读取CAAnimation以了解它开始的确切时间,这可能不是您将其添加到图层的确切时间(见上文)。

于 2013-09-07T12:23:37.547 回答