【发布时间】: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