Xcode SKSpriteKit enumerateChildNodesWithName vs托管数组

时间:2014-09-07 14:02:20

标签: ios objective-c xcode sprite-kit

我想打破我的游戏,所以它可以将功能传递给其他类 - 例如。 CollisionHandler等,例如:

    [collisionHandler handleCollisions:enemies forPlayer:player];

我可以通过两种方式创造“敌人”。阵列。

我可以自己维护它,在他们被创造和杀死时推动和弹出敌人。但这意味着在敌人的阶级中,而不仅仅是这样做..

    [self removeFromParent]

我需要添加更多代码来告诉主游戏场景删除项目等。

或者我可以在需要时使用enumerateChildNodesWithName创建数组。例如,在我的主游戏循环中

    -(void)run
    {
      NSMutableArray *enemies = [self getNodesWithName:@"enemy"];
      [collisionHandler handleCollisions:enemies withPlayer:player];
    }

    -(NSMutableArray*)getNodesWithName:(NSString*)name
    {
      NSMutableArray *result = [NSMutableArray alloc] init];
      [self enumerateNodesWithName:@"enemy" usingBlock:^{[result addObject:node];}];
      return result;
    }

这一切都可以正常使用2,并减少维护我自己的敌人阵列,游戏对象,子弹等的需要

但我的问题是 - 当有很多物品时,这会变得迟钝吗?与自己维护一个对象数组相比,每个帧的枚举和创建数组效率极低吗?或者iOS会快速枚举,不会出现问题吗?

2 个答案:

答案 0 :(得分:1)

我不会认为enumerateNodesWithName非常有效,因为它需要做很多字符串比较。

您可以做的是创建一个NSMutableDictionary,其中包含所有节点作为值,其名称为键。每当您向场景添加节点时,只需将其添加到字典中即可。这样,找到要删除的节点要快得多。只要确保你保持字典是最新的。

答案 1 :(得分:1)

在IOS 8中,SKNode的-enumerateChildNodesWithName:usingBlock:很慢。原因是许多开发人员在枚举时修改节点树导致许多崩溃(NSMutableArray在枚举崩溃时被修改)。

鉴于此,SKNode -enumerate ..在这些情况下更新为崩溃安全,尽管现在它更慢。