我有一些动画且需要在非常特殊的时刻在屏幕上出现,这些都存储在SQLite数据库。 什么我打算做的是使用的NSTimer保持时间,弹出动画到达的具体时间时。
使用一个NSTimer当某些点达到了在屏幕上的动画弹出一个计数的声音文件,动画的持续时间则即时通讯思想。 问题是定时设定都是这样55.715000秒等等都是非常准确,这需要将与动画播放的音轨同步。
首先是这甚至可能,我怎么其次可以比较这些特定的时序我似乎面临的问题是代码不能运行足够快,时间跳跃超过0.001秒。
我没有openGLES或cocos2d的知识和学习这些是不是真的在时间尺度上是可行的。
不管如何准确的定时是,你是不会得到该设备比约60Hz的更频繁显示(每帧16.7毫秒)。 在我看来,你在这里至少有两个选项:
1)使用CADisplayLink
回调检查音频的播放进度,并触发每个动画,因为它变得及时。
显示链接计时器以类似的方式定期创建NSTimers
:
-(void)viewDidLoad
{
// ...
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(scheduleAnimations:)];
[self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}
- (void)scheduleAnimations:(CADisplayLink *)displayLink
{
// get playback time from player object
// iterate queue of timings
// if the timestamp of a timing is equal to or less than the playback time
// create its animation for immediate execution
// remove it from the queue
}
2)创建的动画的集合,设定其各自的beginTime
属性到适当的触发时间(或者,如果使用隐式或基于块的动画,使用delay
参数)。
[CATransaction begin];
// iterate collection of timings
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"key"];
animation.startTime = /* time to trigger animation */
animation.removedOnCompletion = NO;
[layer addAnimation:animation forKey:nil];
[CATransaction commit];
如果您的视觉需要准确地与音频(例如音乐应用程序,其中的动画必须出现在拍)同步,那么你需要用下面的办法。 它适用于很老的iPhone的硬件和有基本上没有什么可以去错在运行时。
使每一个存储为一个完整的画面预渲染每个视觉效果的“框架”。 这可以在桌面上进行,也可以在手机上运行的绘制逻辑,然后捕获输出到文件的像素。
一旦每个帧被保存为像素的阵列,通过在iOS标准AVAudioPlayer API的播放音频。 该API采用了音频播放的关怀和报告时,您将使用以确定要显示的视频帧。
一旦音频播放,让“时间”,并通过视频帧率划分,以确定要显示的图像从N个图像阵列。 获取的图像数据,并在CGImageRef / UIImage的包起来,这将在的blit一个最佳的方式将图像数据在屏幕上。
如果你想看到工作的源代码这种方法,看看AVSync 。 此示例代码显示,我在我的应用程序商店叫iPractice自己的应用程序使用的实现。 这是非常快,并且可以以30fps即使在旧的iPhone 3G上运行。