我有一个带有太空飞船的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%。

ios - SpriteKit:Time Profiler的结果令人怀疑-LMLPHP

在此测试中,stopScrape方法的使用率只有17%,但是,由于我只刮了2-3次,我希望这会小得多。我在此应用程序中添加或删除了许多精灵和发射器,但是似乎只有stopScrape调用被标记为时间密集型。

ios - SpriteKit:Time Profiler的结果令人怀疑-LMLPHP

最佳答案

幕后的粒子发射器正在使用节点创建效果,因此不断对其进行添加和删除。

如果将showsNodesCountYES设置为SKView,您将看到我在说什么。发射器处于 Activity 状态时,节点数将上下波动。

08-26 13:35