Swift FPS在使用SKEffectNode添加模糊时出现问题

Swift FPS在使用SKEffectNode添加模糊时出现问题,swift,sprite-kit,skeffectnode,Swift,Sprite Kit,Skeffectnode,如果有更好的方法来创建模糊效果?我目前的做法似乎造成了FPS问题,尤其是在老式手机上。看起来模糊量越高,FPS越低。blendMode可能是这里的原因吗 if effectsNode.parent == nil { let filter = CIFilter(name: "CIGaussianBlur") let blurAmount = 15.0 filter!.setValue(blurAmount, f

如果有更好的方法来创建模糊效果?我目前的做法似乎造成了FPS问题,尤其是在老式手机上。看起来模糊量越高,FPS越低。blendMode可能是这里的原因吗

        if effectsNode.parent == nil {
            let filter = CIFilter(name: "CIGaussianBlur")
            let blurAmount = 15.0
            filter!.setValue(blurAmount, forKey: kCIInputRadiusKey)

            effectsNode.filter = filter
            effectsNode.blendMode = .add

            sceneContent.removeFromParent()
            effectsNode.addChild(sceneContent)
            addChild(effectsNode)
        }
当我暂停游戏时,我调用blurScreen(),它执行上面的代码。然而,游戏暂停的时间越长,我的fps似乎就越低。我试着取出blurScreen(),FPS问题消失了。当只调用一次blurScreen()时,FPS如何随时间下降

        if effectsNode.parent == nil {
            let filter = CIFilter(name: "CIGaussianBlur")
            let blurAmount = 15.0
            filter!.setValue(blurAmount, forKey: kCIInputRadiusKey)

            effectsNode.filter = filter
            effectsNode.blendMode = .add

            sceneContent.removeFromParent()
            effectsNode.addChild(sceneContent)
            addChild(effectsNode)
        }
编辑:

        if effectsNode.parent == nil {
            let filter = CIFilter(name: "CIGaussianBlur")
            let blurAmount = 15.0
            filter!.setValue(blurAmount, forKey: kCIInputRadiusKey)

            effectsNode.filter = filter
            effectsNode.blendMode = .add

            sceneContent.removeFromParent()
            effectsNode.addChild(sceneContent)
            addChild(effectsNode)
        }
以下是touchesEnded()中的代码

        if effectsNode.parent == nil {
            let filter = CIFilter(name: "CIGaussianBlur")
            let blurAmount = 15.0
            filter!.setValue(blurAmount, forKey: kCIInputRadiusKey)

            effectsNode.filter = filter
            effectsNode.blendMode = .add

            sceneContent.removeFromParent()
            effectsNode.addChild(sceneContent)
            addChild(effectsNode)
        }
更新方法

        if effectsNode.parent == nil {
            let filter = CIFilter(name: "CIGaussianBlur")
            let blurAmount = 15.0
            filter!.setValue(blurAmount, forKey: kCIInputRadiusKey)

            effectsNode.filter = filter
            effectsNode.blendMode = .add

            sceneContent.removeFromParent()
            effectsNode.addChild(sceneContent)
            addChild(effectsNode)
        }
override func update(_ currentTime: TimeInterval) {
    if GameData.shared.firstTimePlaying && GameData.shared.distanceMoved > 600 && !step1Complete {
        tutorial2()
    }

    // Check for game over
    if GameData.shared.hearts == 0 && !gameEnded {
        gameOver()
    }

    // If we're in intermission, do nothing
    if intermission || sceneContent.isPaused {
        return
    }

    // some more stuff unrelated to pausing
}

在整个场景中运行一个效果节点,该场景将渲染每个帧的效果,这将在系统上投入大量工作。如果你没有任何动画,我会推荐你 通过执行此操作,将效果节点转换为精灵节点

        if effectsNode.parent == nil {
            let filter = CIFilter(name: "CIGaussianBlur")
            let blurAmount = 15.0
            filter!.setValue(blurAmount, forKey: kCIInputRadiusKey)

            effectsNode.filter = filter
            effectsNode.blendMode = .add

            sceneContent.removeFromParent()
            effectsNode.addChild(sceneContent)
            addChild(effectsNode)
        }
var spriteScene : SKSpriteNode!
func blurScreen() { 
    DispatchQueue.global(qos: .background).async { 
        [weak self] in
        guard let strongSelf = self else { return }
        let effectsNode = SKEffectNode() 

        let filter = CIFilter(name: "CIGaussianBlur") 
        let blurAmount = 10.0 
        filter!.setValue(blurAmount, forKey: kCIInputRadiusKey) 

        effectsNode.filter = filter 
        effectsNode.blendMode = .add 

        strongSelf.sceneContent.removeFromParent() 
        effectsNode.addChild(strongSelf.sceneContent) 

        let texture = self.view!.texture(from: effectsNode) 
        strongSelf.spriteScene = SKSpriteNode(texture: texture) 
        strongSelf.spriteScene.anchorPoint = CGPoint(x: 0.5, y: 0.5) 

        DispatchQueue.main.async { 
            strongSelf.sceneContent.removeFromParent() 
            strongSelf.addChild(strongSelf.spriteScene) 
        } 
    } 
} 

在整个场景中运行一个效果节点,该场景将渲染每个帧的效果,这将在系统上投入大量工作。如果你没有任何动画,我会推荐你 通过执行此操作,将效果节点转换为精灵节点

        if effectsNode.parent == nil {
            let filter = CIFilter(name: "CIGaussianBlur")
            let blurAmount = 15.0
            filter!.setValue(blurAmount, forKey: kCIInputRadiusKey)

            effectsNode.filter = filter
            effectsNode.blendMode = .add

            sceneContent.removeFromParent()
            effectsNode.addChild(sceneContent)
            addChild(effectsNode)
        }
var spriteScene : SKSpriteNode!
func blurScreen() { 
    DispatchQueue.global(qos: .background).async { 
        [weak self] in
        guard let strongSelf = self else { return }
        let effectsNode = SKEffectNode() 

        let filter = CIFilter(name: "CIGaussianBlur") 
        let blurAmount = 10.0 
        filter!.setValue(blurAmount, forKey: kCIInputRadiusKey) 

        effectsNode.filter = filter 
        effectsNode.blendMode = .add 

        strongSelf.sceneContent.removeFromParent() 
        effectsNode.addChild(strongSelf.sceneContent) 

        let texture = self.view!.texture(from: effectsNode) 
        strongSelf.spriteScene = SKSpriteNode(texture: texture) 
        strongSelf.spriteScene.anchorPoint = CGPoint(x: 0.5, y: 0.5) 

        DispatchQueue.main.async { 
            strongSelf.sceneContent.removeFromParent() 
            strongSelf.addChild(strongSelf.spriteScene) 
        } 
    } 
} 

我们需要看到更多的代码,模糊一次应该不会导致速度减慢,但是在更新循环中模糊也会导致速度减慢,您可以始终在背景线程上进行模糊,完成后,将其添加到主线程上的父线程thread@Knight0fDragon谢谢你的回复!我也是这么想的,我添加了更多与暂停相关的代码。哦,你模糊了整个场景,是的,这会很慢。一定要把它放在背景线程中顺便说一句,场景是一个SKEffectNode,所以你应该能够直接对它应用模糊我们需要看更多的代码,模糊一次应该不会导致减速,但是在更新循环中模糊也会,你可以始终在背景线程上进行模糊,完成后,将其添加到主屏幕上的父级thread@Knight0fDragon谢谢你的回复!我也是这么想的,我添加了更多与暂停相关的代码。哦,你模糊了整个场景,是的,这会很慢。当然要把它放在背景中,顺便说一句,场景是一个SKEffectNode,所以你应该能够直接对它应用模糊