ios粒子发射器 - 如何更快?

时间:2015-02-19 09:30:50

标签: performance sprite-kit particles skemitternode

我在屏幕上有9个块(BlockView只是视图的子类,有一些属性可以跟踪事物),我想在每个块的顶部添加一个烟雾粒子发射器,以添加一些从顶部上升的烟雾每个街区。我创建一个视图来保持块和粒子发射器,并将块放在子视图前面,使块位于前面。然而,这导致我的设备(iphone 6)难以置信地延迟并且很难用平移手势移动块。

SmokeParticles.sks:3的出生率(最大设置为0),10的生命周期(100范围),代码中设置的位置范围。

我为每个视图添加粒子发射器的代码如下(我对粒子发射器不是很好,所以任何建议都值得赞赏!:D)

    - (void)addEffectForSingleBlock:(BlockView *)view
{
    CGFloat spaceBetweenBlocksHeight = (self.SPACE_TO_WALLS * self.view.frame.size.height + self.SPACE_BETWEEN_BLOCKS*self.view.frame.size.width + self.WIDTH_OF_BLOCK*self.view.frame.size.height) - (self.HEIGHT_OF_BLOCK*self.view.frame.size.height + self.SPACE_TO_WALLS * self.view.frame.size.height);
    view.alpha = 1.0;
    CGRect frame2 = [view convertRect:view.bounds toView:self.view];
    UIView * viewLarge = [[UIView alloc] initWithFrame:frame2];
    [self.view addSubview:viewLarge];
    CGRect frame1 = [view convertRect:view.bounds toView:viewLarge];
    view.frame = frame1;
    [viewLarge addSubview:view];
    SKEmitterNode *burstNode = [self particleEmitterWithName:@"SmokeParticles"];
    CGRect frame = CGRectMake(view.bounds.origin.x-self.SPACE_BETWEEN_BLOCKS*self.view.frame.size.width, view.bounds.origin.y-self.SPACE_BETWEEN_BLOCKS_HEIGHT, view.bounds.size.width+self.SPACE_BETWEEN_BLOCKS*self.view.frame.size.width, view.bounds.size.height/2);
    SKView *skView = [[SKView alloc] initWithFrame:frame];
    [viewLarge addSubview:skView];
    SKScene *skScene = [SKScene sceneWithSize:skView.frame.size];
    [skScene addChild:burstNode];
    [viewLarge bringSubviewToFront:view];
    [burstNode     setParticlePositionRange:CGVectorMake(skView.frame.size.width/5, skView.frame.size.height/100.0)];
    skView.allowsTransparency = YES;
    skScene.backgroundColor = [UIColor clearColor];
    skView.backgroundColor = [UIColor clearColor];
    [skView presentScene:skScene];
    [burstNode setPosition:CGPointMake(skView.frame.size.width/2, -skView.frame.size.height*0.25)];
}

1 个答案:

答案 0 :(得分:0)

我意识到这是一个老问题,但我最近学到了一些可能对其他人有所帮助的东西,并决定在这里分享,因为它是相关的(我认为)。

我假设您的BlockView是UIView的子类(如果不是,这对您没有帮助,抱歉)。视图每帧执行许多不必要的计算(例如,每个视图检查是否有人点击它)。在创建游戏时,您应该使用尽可能少的UIViews(这就是为什么所有其他评论者建议您只使用一个SKView并使每个块成为SKSpriteNode,这不是视图的原因。但是,如果您需要使用其他类型的对象,或者您不想使用SpriteKit(或用于3D对象的SceneKit),请尝试在单个CALayers内使用UIView(例如,一个案例)您希望使用CALayers代替SpriteKit,以增加与旧版iOS版本的向后兼容性,因为SpriteKit需要iOS 7)。

先生。 John Blanco在他的View vs. Layers (including Clock Demo)中很好地解释了CALayer方法。