【问题标题】:How to Improve SKEffectNode Performance (Swift)?如何提高 SKEffectNode 性能(Swift)?
【发布时间】:2016-11-15 15:24:24
【问题描述】:

所以在我的项目中,我有一个 SKEffectNode,用于在我的一些 spriteNode 周围提供发光效果。我使用 spriteNode (blurNode) 来获取障碍物的颜色,然后将其提供给 effectNode。这很好用。

 let blurNode = SKSpriteNode(imageNamed: "neonLine.png")
    blurNode.color = obstacle.color
    blurNode.colorBlendFactor = 1.0
    blurNode.size = CGSize(width: obstacle.size.width + 30, height: obstacle.size.height + 30)


    let effectNode = SKEffectNode()
    effectNode.shouldRasterize = true
    obstacle.addChild(effectNode)
    effectNode.addChild(blurNode)
    effectNode.filter = CIFilter(name: "CIGaussianBlur", withInputParameters: ["inputRadius":30])
    effectNode.alpha = 1.0

我的问题出现在这里。

let colorFadegreen = SKAction.sequence([SKAction.colorize(with: UIColor(red: 0, green: 0.6471, blue: 0.3569, alpha: 1.0), colorBlendFactor: 1.0, duration: 3)])

obstacle.removeAllActions()
obstacle.run(colorFadegreen)

blurNode.removeAllActions()
blurNode.run(colorFadegreen)

我想要做的是让障碍物周围的“发光”随着障碍物改变颜色。这正是发生的事情;但是,当我这样做时,我的帧速率会下降到 30fps。

所以,我的问题是有谁知道如何提高这项任务的性能?或者是否有另一种方法可以做到这一点。

我想到的一个想法是在photoshop中手动模糊“neonLine.png”,然后像这样将它添加到模糊节点 let blurNode = SKSpriteNode(imageNamed: "bluredNeonLine.png")。唯一的问题是我永远无法正确模糊它总是看起来很模糊。

任何帮助将不胜感激。谢谢!

编辑:

以下是我项目中发光的一些照片:

这里是发光和改变颜色的线条:

【问题讨论】:

  • 你能给我看一个你喜欢的发光的例子吗?如果是这样,我可能会向您展示如何使用代码来实现。至于提高更改颜色能力的性能,您可以栅格化您的节点并对其应用颜色更改,或者将其烘焙到 SKTexture 中,然后从中创建一个 Sprite,然后更改其颜色。
  • 嘿,我编辑了我的帖子,向您展示我喜欢的光芒。此外,我认为将其烘焙到纹理中是我正在寻找的。你是怎么做到的?
  • 旁注,因为您正在考虑渲染到纹理,您可以使用具有不同半径和不透明度的多个发光效果来获得非常漂亮的发光渐变。大多数好看的光晕都是通过这种方式完成的,叠加不同大小和强度的效果,以获得指数级的衰减,看起来要好得多。
  • 只是想一想,如果你去掉这条线,你是否还能让颜色混合工作,并回到 60fps:blurNode.run(colorFadegreen)
  • 我问,因为这个淡入淡出的动画将导致效果通过重新渲染动画的每一帧来重新创建自己,改变颜色,并对它们中的每一个进行光栅化,也。所以这是双重工作,而且可能从一开始就没有必要。如果您的 neonLine.png 是白色的,并且您将它着色为蓝色,那么如果您删除了 blurNode 着色的动画,这应该与 shouldRasterise 一起执行。

标签: swift sprite-kit skeffectnode


【解决方案1】:

关于发光性能问题的三个答案:

    1. 使用预渲染光晕,根据您在问题中提到的,在 Photoshop 或类似的位图编辑器中完成,导出为具有不透明度的位图并用作 SKSpriteNode 纹理,可能使用加法混合以获得最佳效果,并将色阶用于味道。
    1. 烘焙 SKEffectNode 的纹理,通过将其制成纹理,然后将其加载到 SKSpriteNode 中,在 SpriteKit 中创建所需的辉光,如以下示例所示:https://stackoverflow.com/a/40137270/2109038
    1. 光栅化来自 SKEffectNode 的结果,然后希望您对色偏的更改不会导致重新渲染。这显示在一个精彩的扩展中,在这里:https://stackoverflow.com/a/40362874/2109038

在所有情况下,您最好渲染一个随心所欲地淡出的白光,然后对其应用颜色混合更改,因为 SpriteKit 已内置此功能,并且在我进行的少数测试中表现相当不错完毕。这称为着色:

您可以更改混合量并为其设置动画:https://developer.apple.com/reference/spritekit/skspritenode/1519780-colorblendfactor

以及与纹理混合的颜色:https://developer.apple.com/reference/spritekit/skspritenode/1519639-color

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 2021-06-13
    • 2020-09-09
    • 2012-06-24
    • 2021-05-28
    • 2020-03-31
    相关资源
    最近更新 更多