My app adds a custom SKNode
object to a SKScene
at a fixed interval (sub second) using an NSTimer
. At certain times I want the timer to speed up. Here's what I do (code simplified):
@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];
}
I've noticed a slight lag every time i call speedUp
. I'm very new to Objective-C so not sure how to resolve. Is it more efficient to use dispatch queues over a timer or can I not avoid this issue because the internal is so fast?
I ran time profiling on instruments and this was not highlighted - instead my heaviest method was addNodeToScene
.