我的应用使用SKNode
以固定间隔(次秒)向SKScene
添加自定义NSTimer
对象。在某些时候,我希望计时器加速。这就是我的所作所为(代码简化):
@interface MyScene : SKScene
@end
@implementation MyScene {
MyNode *node;
NSTimer *timer;
int speed;
}
- (id):initWithSize:(CGSize)size {
if (self = [super initWithSize:size]) {
speed = 0.8f;
timer = [NSTimer = scheduledTimerWithTimeInterval:speed target:self selector:@selector(addNodeToScene) userInfo:nil repeats:YES];
}
}
- (id):addNodeToScene {
if (node != nil) {
[node removeFromParent];
node = nil;
}
CGPoint location = //random x y coordinates using arc4random()...
node = [[MyNode alloc] initAtLocation:location];
[self addChild:node];
}
// at some point I call this method (called regularly throughout life of app)
- (id):speedUp {
[timer invalidate];
timer = nil;
speed *= 0.9f;
timer = [NSTimer = scheduledTimerWithTimeInterval:speed target:self selector:@selector(addNodeToScene) userInfo:nil repeats:YES];
}
每次拨打speedUp
时,我都注意到了轻微的延迟。我对Objective-C很新,所以不确定如何解决。在计时器上使用调度队列是否更有效,或者我不能避免这个问题,因为内部速度如此之快?
我对乐器进行了时间分析,并没有突出显示 - 相反,我最重的方法是addNodeToScene
。
答案 0 :(得分:2)
我的猜测是,您在-speedUp
的正常工作之外打电话给-addNodeToScene
。如果是这样,滞后很可能来自于你已经用完了之前一段延迟的事实,那么-speedUp
使旧计时器失效并创建一个新计时器,这将再次开始延迟。每当你超过之前的计时器火力超过10%时,你就会看到滞后。
我将尝试一些ASCII艺术来说明。 +
是计时器触发,*
是您致电-speedUp
并重置计时器。
+---------+--------+---------+---------+---------+
+---------+---*--------+--------+--------+--------+
答案 1 :(得分:0)
在另一个问题中找到解决方案:Xcode / Objective-C: Why is NSTimer sometimes slow/choppy?
(使用CADisplayLink
代替NSTimer
)