Ios iPad:需要准确的NSTimer替代品来制作金刚式游戏

Ios iPad:需要准确的NSTimer替代品来制作金刚式游戏,ios,multithreading,loops,nstimer,Ios,Multithreading,Loops,Nstimer,我正在制作一个游戏和观看风格的游戏(还记得金刚驴吗?),所有的敌人都会按设定的间隔移动 金刚号中的桶可以精确地每1秒移动一步。准确度是至关重要的,因为运动员需要预测动作并计划跳跃 我正在使用一个NSTimer来运行一个函数,该函数基本上可以将所有敌人向前移动一步。这是伟大的工作,但后来我注意到,每现在和敌人会短暂冻结,这破坏了游戏。阅读NSTimer文档,似乎这就是使用NSTimer时的方式 我尝试的是: 我最初使用scheduledTimerWithTimeInterval,但阅读了另一个建议

我正在制作一个游戏和观看风格的游戏(还记得金刚驴吗?),所有的敌人都会按设定的间隔移动

金刚号中的桶可以精确地每1秒移动一步。准确度是至关重要的,因为运动员需要预测动作并计划跳跃

我正在使用一个NSTimer来运行一个函数,该函数基本上可以将所有敌人向前移动一步。这是伟大的工作,但后来我注意到,每现在和敌人会短暂冻结,这破坏了游戏。阅读NSTimer文档,似乎这就是使用NSTimer时的方式

我尝试的是:

我最初使用scheduledTimerWithTimeInterval,但阅读了另一个建议使用timerWithTimeInterval的线程

[[NSRunLoop currentRunLoop] addTimer:autoMoveTimer forMode:NSRunLoopCommonModes];
但我还是注意到了寒冷

我没有每秒运行一次计时器,而是尝试让它更频繁地运行,然后在函数内部使用

NSTimeInterval elapsedTimeInterval;
elapsedTimeInterval = [gameTickerLastRan timeIntervalSinceNow];

if(elapsedTimeInterval<-gameSpeed){

        NSLog(@"%f since ticker last ran",elapsedTimeInterval);

        gameTickerLastRan=[NSDate date];

//do stuff in function

}
在该功能结束时,在所有的敌人都被移动到一个台阶上之后,我尝试使用

[self performSelector:@selector(sweetNothings) withObject:nil afterDelay:0.0];
但这没用

我曾短暂地尝试为计时器创建一个专用线程,但我尝试的都不起作用,我觉得太深了,无法进行太多的实验

故事板包含大约100个UIImageView,它们的布局类似于逐帧动画。然后,我使用它们的隐藏属性打开和关闭它们来创建动画

有谁能给我推荐一个可靠的方法,让我以精确的间隔运行这个函数,并绕过图形冻结

编辑:我尝试了一个CADisplayLink,但它看起来完全一样——也就是说,大约每10秒它就会冻结一秒钟。这就是我所拥有的

displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(gameTicker:)];

[displayLink setFrameInterval:1];

[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
然后在游戏中我有

CFTimeInterval elapsedTime = displayLink.timestamp - lastDrawTime;
NSLog(@"elapsed %f", elapsedTime);
if(elapsedTime>=gameSpeed){
//do stuff
lastDrawTime = displayLink.timestamp;
}

编辑2:我不好意思说我刚刚意识到这根本不是滞后。我在移除元素的同时向前循环一个数组,这造成了延迟的错觉。谢谢你指点我到CADisplayLink无论如何-看起来非常有用。我应该删除我的问题吗?

看一看(这是Cocos2d和其他游戏框架所使用的)。

为什么不使用Cocos2d?它拥有你创造这种游戏所需要的一切,我以前从未听说过。我以前在flash中构建过很多这样的游戏,我想看看是否可以将我的结构转换为objective C。另外,如果我已经编写了所有的代码,那么调试起来就更容易了。这个框架看起来很有趣,但我一定会考虑它的未来项目。谢谢你的回复。可能的副本看起来很有趣。我明天去试一试。谢谢看看这个答案,快速设置!我和一个CADiplayLink一样被冻住了。我编辑了原稿。谢谢,我不好意思说,我刚刚意识到这根本不是滞后。我在移除元素的同时向前循环一个数组,这造成了延迟的错觉。谢谢你指点我到CADisplayLink无论如何-看起来非常有用。我应该删除我的问题还是把这个标记为答案?
CFTimeInterval elapsedTime = displayLink.timestamp - lastDrawTime;
NSLog(@"elapsed %f", elapsedTime);
if(elapsedTime>=gameSpeed){
//do stuff
lastDrawTime = displayLink.timestamp;
}