预加载SKEmitterNode,使用时滞后

时间:2018-03-15 08:36:16

标签: swift sprite-kit skemitternode

这就是我放置发射器的方式:

func addParticle(at: CGPoint) {
        let emitter = SKEmitterNode(fileNamed: "hit.sks")
        emitter?.position = at
        emitter?.zPosition = 10
        scene.addChild(emitter!)
        scene.run(SKAction.wait(forDuration: 1), completion: {
            emitter?.removeFromParent()
        })
    }

有时我有性能滞后,时间分析器告诉我,我有sks文件延迟(文件解码等)。 有什么办法可以避免这种情况吗?

2 个答案:

答案 0 :(得分:2)

你实际上并没有预加载粒子系统。你每次都要创建一个新的,然后删除它(并导致它没有引用它),所以它得到了GC。

相反,将粒子系统添加到屏幕外的节点,当您需要它时,将其移回场景,您需要/想要它,然后在不再需要它时将其移回屏幕外。

这样可以防止创建粒子系统,卷起它并让它运行等等。

你只需要播放并暂停它......并移动它。

您可以直接暂停粒子系统,也可以暂停其父节点,以便在您将其重新显示在屏幕上时,它处于您希望它处于的状态。

在此处阅读更多内容:https://developer.apple.com/documentation/spritekit/skemitternode/1398027-advancesimulationtime

答案 1 :(得分:0)

好的,所以我通过创建一个粒子管理器对它进行了整理,该粒子管理器创建了游戏所需的所有粒子。当我需要其中之一时,我只是使用.copy()方法? SKEmitterNode。当然,粒子管理器是一个聪明的类,可以完成所有工作(重置动画和开始)并提供随时可用的发射器。 这样-没有滞后,没有时间解码/初始化等 希望对别人有帮助