我有一个带有太空飞船的SpriteKit游戏,它会在接触侧壁时使用粒子发射器。我的SpaceShip对象具有代码,只要它在侧面刮擦,就可以从太空船的侧面添加或移除发射器。当通过Time Profiler仪器运行时,结果表明" removeFromParent"在stopScrape方法中调用占用总应用时间的40%。此外,它说该方法是" removeFromParent"我插入的NSLogs显示每次调用scrape方法时只调用一次,在该方法中调用了几十次。我不确定这只是Time Profiler的一个问题,还是我的代码中存在问题。它像我正在做的那样接缝是非常直接的,但是这种方法一直被时间分析器调出。我还尝试使用从Ship中删除子发射器而不是让发射器移除其父级,但它仍然在Profiler中显示为性能问题。提前感谢任何人提供的任何见解。
-(void) scrape: (ScrapeDirection) scrapeDirection
{
if(!self.isScraping)
{
[self runAction: self.repeatScrapeSoundAction withKey:@"scrape"];
NSLog(@"start");
if((scrapeDirection & ScrapeRight) !=0)
{
self.scrapeParticle.position = CGPointMake(40, -70);
} else
{
self.scrapeParticle.position = CGPointMake(-40, -70);
}
[self.spaceShip addChild: self.scrapeParticle];
self.isScraping=YES;
}
}
-(void) stopScrape
{
if(self.isScraping==YES)
{
NSLog(@"STOP");
self.isScraping=NO;
[self removeActionForKey:@"scrape"];
[self.scrapeParticle removeFromParent];// removeChildrenInArray: [[NSArray alloc] initWithObjects: self.scrapeParticle, nil]];
}
}
我添加了两个我在分析器中看到的快照。在第一个中,removeFromParent说它在这个线程上被称为14X,而在其他线程上也被称为14X,而记录器显示它在测试期间实际上只发生了2-3次。最终结果是removeFromParent调用是此方法使用时间的98%。
Timer Profile http://oi59.tinypic.com/22apg0.jpg
在这次测试中,stopScrape方法只有17%的时间,但是,因为我只擦了2-3次墙,我预计这会小得多。我在这个应用程序中添加/删除了许多精灵和发射器,但只有stopScrape调用似乎被标记为时间密集。
答案 0 :(得分:1)
幕后的粒子发射器使用节点来创建效果,因此不断添加和删除它们。
如果您为showsNodesCount
设置了YES
至SKView
,则会看到我在说什么。当发射器处于活动状态时,节点数将上下波动。