SpriteKit:300个节点的碰撞,非常低的FPS

时间:2013-09-16 11:41:56

标签: ios performance 2d

我想制作一个简单的SpriteKit应用程序,我可以添加“岩石”,它们会落到屏幕的底部。就像这样:http://aamukasa.fi/II-13-347。实现非常简单,但是当节点数超过100时,我会遇到巨大的性能问题。当所有块碰撞在一起时,FPS低于10。反正有没有通过良好的FPS和大约300-400块实现这种功能?

@implementation MyScene

-(id)initWithSize:(CGSize)size {    
if (self = [super initWithSize:size]) {
    /* Setup your scene here */

    self.backgroundColor = [SKColor colorWithWhite:1 alpha:1];
    self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
    self.scaleMode = SKSceneScaleModeAspectFit;


}
return self;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
/* Called when a touch begins */

for (UITouch *touch in touches) {
    CGPoint location = [touch locationInNode:self];

    SKSpriteNode *rock = [[SKSpriteNode alloc] initWithColor:[SKColor blackColor]     size:CGSizeMake(20,10)];
    rock.position = location;
    rock.name = @"rock";
    rock.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:rock.size];
    [self addChild:rock];

}
}

-(void)update:(CFTimeInterval)currentTime {
/* Called before each frame is rendered */
}

@end

3 个答案:

答案 0 :(得分:2)

你可能想尝试给你的岩石一个圆形的物理体。我认为它不会解决问题,但可能会增加帧速率!据我所知,圆形物理实体的性能优于矩形实体。

答案 1 :(得分:0)

您应该在设备上测试以查看实际的FPS。在模拟器中,我获得60 FPS直到达到200块砖。

然后它开始下降,但在设备上你可以获得更好的结果。

答案 2 :(得分:0)

不确定你是否还在寻找,但可以尝试这样的事情:

-(void)didSimulatePhysics
{
    [self enumerateChildNodesWithName:@"rock" usingBlock:^(SKNode *node, BOOL *stop) {
        if (node.position.y < 0)
            [node removeFromParent];
    }];
}

否则节点会留在内存中,FPS会加剧加班。