我有一个带有太空飞船的SpriteKit游戏,当它碰到侧壁时会使用粒子发射器。我的SpaceShip对象具有代码,只要它在侧面刮擦,就可以从飞船的侧面添加或删除发射器。通过Time Profiler Instrument运行时,结果表明stopScrape方法中的“removeFromParent”调用占用了总应用程序时间的40%。此外,它说该方法是“removeFromParent”,该方法被调用了数十次,而我插入的NSLogs显示,每次调用scrape方法时,该方法仅被调用一次。我不确定这只是Time Profiler的问题还是我的代码中的问题。好像我在做的事情很简单,但是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%。
在此测试中,stopScrape方法的使用率只有17%,但是,由于我只刮了2-3次,我希望这会小得多。我在此应用程序中添加或删除了许多精灵和发射器,但是似乎只有stopScrape调用被标记为时间密集型。
最佳答案
幕后的粒子发射器正在使用节点创建效果,因此不断对其进行添加和删除。
如果将showsNodesCount
的YES
设置为SKView
,您将看到我在说什么。发射器处于 Activity 状态时,节点数将上下波动。