首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SKEffectNode添加模糊的FPS问题

使用SKEffectNode添加模糊的FPS问题
EN

Stack Overflow用户
提问于 2017-10-27 14:08:05
回答 1查看 255关注 0票数 1

如果有更好的方法创造一个模糊的效果?这似乎是我目前的做法,它创造了FPS问题,特别是在旧手机。似乎blurAmount越高,FPS越低。blendMode会是这里的原因吗?

代码语言:javascript
复制
        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是如何随时间下降的呢?

编辑:

代码语言:javascript
复制
func pauseGame() {
    sceneContent.isPaused = true
    intermission = true

    physicsWorld.speed = 0

    blurScreen()
} 

以下是touchesEnded()中的代码

代码语言:javascript
复制
// 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
                }

更新方法

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-27 18:42:22

你在整个场景上运行一个效果节点,这个场景将呈现出每个框架的效果,这将给你的系统带来大量的工作。如果后面没有动画,我建议通过这样做将效果节点转换为sprite节点。

代码语言:javascript
复制
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) 
        } 
    } 
} 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46977009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档