我正在制作游戏并观看风格游戏(还记得Donkey Kong吗?)所有敌人都会按照设定的间隔移动。
EG。驴子的桶可能每1秒移动一步。准确性至关重要,因为玩家需要预测运动并计划跳跃。
我正在使用NSTimer来运行一个功能,该功能基本上可以将所有敌人向前移动一步。这工作得很好但后来我注意到现在每个人都会暂时冻结,这会破坏比赛。阅读NSTimer文档,似乎这就是使用NSTimers时的方式。
我尝试了什么:
我最初使用的是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
}
但我仍然注意到冻结,即使输出的经过时间对我来说也很准确。
-1.006408 since ticker last ran
-1.006985 since ticker last ran
-1.007313 since ticker last ran
-1.007193 since ticker last ran
-1.006768 since ticker last ran
-1.007468 since ticker last ran
-1.007429 since ticker last ran
-1.006759 since ticker last ran
-1.007435 since ticker last ran
在该功能结束时,在所有敌人被移动一步后,我尝试强制图形更新
[self performSelector:@selector(sweetNothings) withObject:nil afterDelay:0.0];
但这没有帮助。
我曾尝试为计时器创建一个专用线程,但我尝试的不起作用,我觉得我的实验太多了。
故事板包含大约100个UIImageViews,它们像逐帧动画一样布局。然后我使用隐藏属性打开和关闭它们来创建动画。
任何人都可以建议我以一种坚实的方式以精确的间隔运行此功能并绕过图形冻结吗?
编辑:我尝试了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 - 看起来非常有用。我应该删除我的问题吗?