Должен ли я вручную удалять эмиттерный узел из родительского после того, как он закончил играть?

В настоящее время я отображаю эффекты частиц, когда мой спрайт сталкивается с другим спрайтом в игре.

У меня есть этот фрагмент кода:

let sparkParticle = SKEmitterNode(fileNamed: "SparkParticle.sks")
if sparkParticle.parent == nil
{
    sparkParticle.position = mySprite.position
    self._particleLayer.addChild(sparkParticle)
}
sparkParticle.resetSimulation()

Созданная мною частица имеет скорость рождения 1000 частиц с максимальным значением 100. Я установил положение узла эмиттера частиц там, где мой спрайт в данный момент находится на экране. Затем я добавляю его как дочерний элемент узла слоя частиц.

Мой вопрос: нужно ли вручную удалять узел эмиттера частиц из его родителя после его завершения? Или Sprite Kit автоматически удаляет его после завершения воспроизведения?

Поскольку мой проект предназначен для того, чтобы спрайты часто сталкивались друг с другом, я хочу убедиться, что мне все еще нужно обрабатывать это вручную, чтобы предотвратить утечку памяти (у слоя частиц есть много дочерних узлов-эмиттеров, которые уже закончили играть)


person aresz    schedule 03.02.2015    source источник
comment
вы должны удалить его самостоятельно.   -  person hamobi    schedule 03.02.2015
comment
@hamobi спасибо за комментарий. существует ли событие/метод, который запускается, когда узел эмиттера завершает воспроизведение, чтобы я мог определить, когда его удалить?   -  person aresz    schedule 04.02.2015
comment
Нет, я так не думаю. Я просто удаляю его через определенное время с помощью SKAction.   -  person hamobi    schedule 04.02.2015


Ответы (2)


Короткий ответ: нет, вам не нужно беспокоиться об этом в вашем случае. Но если эмиттер частиц не отображается на экране или работает постоянно, это становится большей проблемой. Когда сцена будет освобождена, SKEmitterNode будет удален автоматически. Потому что SKEMitterNode — это SKNode, который вставляется в дерево узлов.

Однако, если вы хотите быть особенно осторожным, вы можете вручную и рекурсивно остановить все действия и эмиттеры до того, как сцена освободится, с помощью следующего метода. У меня были проблемы с отложенным срабатыванием SKActions после того, как сцена была освобождена, и это привело к сбою моего приложения, поэтому я вручную останавливал их все до того, как сцена была освобождена.

Сохраните ссылку на старую сцену и вызовите это на сцене:

+(void)recursivelyStopAndRemoveNode:(SKNode*)node {

    // recursively call all children
    for (SKNode *childNode in [node children]) {
        [PCUtils recursivelyStopAndRemoveNode:childNode];
    }

    // stop emitters
    if ( [node isKindOfClass:[SKEmitterNode class]]) {
        SKEmitterNode* sken = (SKEmitterNode*)node;
        sken.targetNode = nil;
        sken.particleBirthRate = 0;
        NSLog(@"stopping emitter %@", node.name);
    }

    // stop any running actions
    [node removeAllActions];

    // remove me from my parent.
    [node removeFromParent];

}

Затем используйте его в своем GameViewController или везде, где вы меняете сцены:

SKScene *oldScene = skView.scene;
[skView presentScene:newScene transition:nil];
if (oldScene) 
   [PCUtils recursivelyStopAndRemoveNode:oldScene];
person Patrick Collins    schedule 03.02.2015
comment
Спасибо за объяснение. Это помогает :) - person aresz; 04.02.2015

Я действительно рекомендую вам удалить излучатель. Недавно у меня была проблема в моей игре, когда она начинала очень сильно отставать, потому что я не удалял эмиттеры. Это была проблема, которую я смог воспроизвести на 100%, когда были добавлены эмиттеры, поэтому я точно знаю, что они были единственной причиной падения частоты кадров. Потребовалось около 20 неубранных эмиттеров, прежде чем я начал видеть отставание.

На самом деле это довольно легко. Вы можете создать SKAction Sequence, содержащую действие ожидания (1 секунду или чуть больше продолжительности вашего эффекта) и действие removeFromParent.

Это позволит избавиться от него почти сразу после того, как это будет сделано, и гарантирует, что частота кадров не упадет.

person David Baez    schedule 24.08.2017