【问题标题】:FPS issues with adding a blur using SKEffectNode使用 SKEffectNode 添加模糊的 FPS 问题
【发布时间】:2017-10-27 14:08:05
【问题描述】:

是否有更好的方法来创建模糊效果?我目前的做法似乎会产生 FPS 问题,尤其是在旧手机上。似乎 blurAmount 越高,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 是如何随时间下降的?

编辑:

func pauseGame() {
    sceneContent.isPaused = true
    intermission = true

    physicsWorld.speed = 0

    blurScreen()
} 

这是 touchesEnded() 中的代码

// Tapped pause or pause menu options
if name == "pause" && touch.tapCount == 1 && pauseSprite.alpha == 1.0 && ((!sceneContent.isPaused && !GameData.shared.midNewDay) || (!sceneContent.isPaused && sceneElements[0].editingMode)) {
                    SKTAudio.sharedInstance.pauseBackgroundMusic()
                    SKTAudio.sharedInstance.playSoundEffect("Sounds/pause.wav")

                   pauseSprite.run(SKAction.sequence([SKAction.scale(to: 1.2, duration: 0.10), SKAction.scale(to: 1.0, duration: 0.10)])) { [unowned self] in
                        self.createPauseMenu()
                        self.pauseGame()
                    }

                    return
                }

更新方法

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
}

【问题讨论】:

  • 我们需要看更多的代码,模糊一次应该不会导致速度变慢,但是更新循环上的模糊会
  • 另外,你可以随时在后台线程上做模糊处理,完成后,将其添加到主线程上的父级
  • @Knight0fDragon 感谢您的回复!我也是这么想的,我加了一些暂停相关的代码
  • 哦,你正在模糊整个场景,是的,这会很慢。绝对把它放在后台线程中
  • 顺便说一句,场景是一个 SKEffectNode,所以你应该可以直接对其应用模糊

标签: swift sprite-kit skeffectnode


【解决方案1】:

您正在整个场景上运行一个效果节点,该场景将在每一帧都渲染该效果,这将为您的系统带来大量工作。如果你后面没有任何动画,我会推荐 通过这样做将您的效果节点转换为精灵节点

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) 
        } 
    } 
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 2016-08-02
    • 2012-03-11
    相关资源
    最近更新 更多