我CADisplayLink
用来执行声音和动画之间的同步。同步需要非常精确,并且当前CADisplayLink
以frameInterval
1 运行并不能足够频繁地调用选择器。
有没有办法增加它的粒度?(frameInterval
是一个整数属性,所以我显然不能低于 1)
我CADisplayLink
用来执行声音和动画之间的同步。同步需要非常精确,并且当前CADisplayLink
以frameInterval
1 运行并不能足够频繁地调用选择器。
有没有办法增加它的粒度?(frameInterval
是一个整数属性,所以我显然不能低于 1)
老问题,但它提出了有趣的观点,所以我会给我 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 在它被调用时使用的时间CAAnimation
的beginTime
属性(它从CAMediaTiming
协议中获得)设置beginTime
为偏移量CACurrentMediaTime
将允许您创建以非常精确和受控的时间开始的动画。如果将动画添加到图层时将其保留为 0(默认值),它将CACurrentMediaTime
在 runloop 结束时自动设置为 ,从而导致控制时间较少。
您还可以beginTime
从运行中读取CAAnimation
以了解它开始的确切时间,这可能不是您将其添加到图层的确切时间(见上文)。