【发布时间】: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