【问题标题】:ios particle emitter - how to make faster?ios粒子发射器 - 如何更快?
【发布时间】:2015-02-19 09:30:50
【问题描述】:

我在屏幕上有 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)];
}

【问题讨论】:

  • 好吧,从减少粒子数开始。如果我计算 3 * 60 fps * 10 秒,我得到每个发射器的总粒子数为 1800 个,除非最大粒子数限制设置低于此值。那是一大堆粒子。总共需要几百个粒子(所有发射器加在一起)。
  • 感谢您的回复!对不起,但我对这个粒子的东西真的很陌生。如果它的出生率为 3,寿命为 10(尽管我猜范围可能会更大),并且有 9 个块,那么 10 秒后不是 3*10*9 个粒子吗?为什么要把粒子数乘以 60?
  • 另外,如果我在 Xcode 中制作一个通用的 flame.sks 文件,它的默认设置是 455 出生率和 2.5 寿命 --> 这并不意味着 2.5 秒后屏幕上有 1100 个粒子一个默认的火焰发射器?在应用中实施默认设置是否不可行,尤其是如果我想要 2 个火焰?
  • 尝试使用背景作为 SKView 并向其添加单个场景。然后将发射器节点添加到该场景中。
  • 我认为birthRate 是用帧来衡量的,但文档说它是每秒粒子数,所以我错了。

标签: performance sprite-kit particles skemitternode


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多