NSTimer更改间隔性能

时间:2014-07-12 15:22:31

标签: ios objective-c performance nstimer

我的应用使用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

2 个答案:

答案 0 :(得分:2)

我的猜测是,您在-speedUp的正常工作之外打电话给-addNodeToScene。如果是这样,滞后很可能来自于你已经用完了之前一段延迟的事实,那么-speedUp使旧计时器失效并创建一个新计时器,这将再次开始延迟。每当你超过之前的计时器火力超过10%时,你就会看到滞后。

我将尝试一些ASCII艺术来说明。 +是计时器触发,*是您致电-speedUp并重置计时器。

+---------+--------+---------+---------+---------+
+---------+---*--------+--------+--------+--------+

答案 1 :(得分:0)

在另一个问题中找到解决方案:Xcode / Objective-C: Why is NSTimer sometimes slow/choppy?

(使用CADisplayLink代替NSTimer