Search code examples
sprite-kit2d-games

SKSpriteNode removeFromParent very slow


Was running into some curious performance issues with:

NSMutableDictionary* creatureNodeDict // all my currently drawn sprites that are moving

after compiling all sprites that will be visible into keyArr, I remove the ones that moved off the screen, like so:

NSMutableArray* spritesToDel = [NSMutableArray arrayWithArray:self.creatureNodeDict.allKeys] ;
[spritesToDel removeObjectsInArray:keyArr];

to then remove them in a loop like:

    for (NSString* key in spritesToDel) {
        SKSpriteNode* node = [self.creatureNodeDict objectForKey:key];
        [node removeFromParent];
    }

now this was extremely slow, like 500ms for 700 sprites slow.


Solution

  • I was about to ask if anyone had any advice, when I tried it with a simple trick myself:

    NSMutableArray* spritesToRemoveArray = [[NSMutableArray alloc] init];
    for (NSString* key in spritesToDel) {
        SKSpriteNode* node = [self.creatureNodeDict objectForKey:key];
        if (node.parent == mainParentNode) {
            [spritesToRemoveArray addObject:node];
        }
        else {
            AFLog(@"parent %@ is not map", node.parent);
            [node removeFromParent];
        }
    }
    [mainParentNode removeChildrenInArray:spritesToRemoveArray];
    

    Now removing 500-800sprites takes 20-40ms!