Проблема производительности SKEffectNode для CIFilter(имя: "CIGaussianBlur") с shouldRasterize = true

Я пытаюсь добавить свечение к персонажам или объектам в моей игре, которые наносят урон. Я хочу красного свечения для "плохих" вещей в игре, то есть спайков, охранников и т. Д. Я использую следующий код, но производительность действительно плохая, даже если для растеризации задано значение true. Когда я добавляю эффекты, производительность довольно быстро падает с 60 кадров в секунду до ~30 кадров в секунду. Эффект свечения должен быть на спрайтах разной формы, т.е. круги, треугольники, прямоугольники, люди и т. д. Я открыт для других подходов, хотя приведенный ниже код дает мне точный визуальный эффект, который я хочу. Если я смогу выполнить код, я бы хотел добавить зеленый свет на "хорошие" объекты.

Я также уменьшил количество "плохих" SKN-узлов, добавив только узлы, которые по 1,5 сцены слева и справа. Это изменение, похоже, не помогло. Проблема, кажется, заключается в том, что я нахожусь в особенно большой популяции SKNodes и SKNodes/SKSpriteNodes с добавленным эффектом.

glowAtlas = SKTextureAtlas(named: "GlowTextures")

// create a glowing effect
func getGlow(imageName: String, imageSize: CGSize, glowColor: SKColor) -> SKEffectNode {

пытаться

 let glow = SKSpriteNode(imageNamed: imageName)

или же

let texture = glowAtlas.textureNamed(imageName)
let glow = SKSpriteNode(texture: texture)

...

 glow.size = imageSize
 glow.color = glowColor
 glow.colorBlendFactor = 1.0

 // Create an effects node with a gaussian blur filter
 let effectsNode = SKEffectNode()
 effectsNode.shouldRasterize = true
 effectsNode.shouldEnableEffects = true

 let filter = CIFilter(name: "CIGaussianBlur")
 // Set the blur amount. Adjust this to achieve the desired effect
 let blurAmount = 5.0
 filter!.setValue(blurAmount, forKey: kCIInputRadiusKey)

 effectsNode.filter = filter
 effectsNode.blendMode = .Alpha
 effectsNode.addChild(glow)

 return effectsNode
}

0 ответов

Другие вопросы по тегам