我有一个 SpriteKit 游戏,其中有一艘 spaceship ,当它接触到侧壁时会使用粒子发射器。我的 SpaceShip 对象具有代码,可以在飞船侧面抓取时在飞船侧面添加或移除发射器。通过 Time Profiler Instrument 运行时,结果表明 stopScrape 方法中的“removeFromParent”调用占用了总应用程序时间的 40%。此外,它说该方法是“removeFromParent”,在该方法中调用了数十次,而我插入的 NSLog 显示每次调用 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 次墙,我预计这会小得多。我在这个应用程序中添加/删除了许多 Sprite 和发射器,但似乎只有 stopScrape 调用被标记为时间密集。
最佳答案
幕后的粒子发射器使用节点来创建效果,因此不断添加和删除它们。
如果为您的 SKView
将 showsNodesCount
设置为 YES
,您就会明白我在说什么。当发射器处于事件状态时,节点数会上下波动。
关于ios - SpriteKit : Questionable results from Time Profiler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24614650/