如何在SpriteKit中应用全屏SKEffectNode进行后期处理

Sal*_*rtz 5 core-image ios ios7 sprite-kit skeffectnode

我正在尝试使用以下设置SpriteKit:

  1. 具有两个子节点的SKScene仅用于对其他节点进行分组:前景和背景.
  2. 截至目前,背景确实是空的,但最终会保留某种类型的背景精灵/图层.
  3. foreground是一个SKEffectNode,每当用户点击屏幕时,表示游戏元素的SKnode子类的新内容将作为子元素添加到其中.
  4. 此SKNode子类基本上创建3个SKShapeNodes和两个标签:外圆周,内圆周,2个标签和内圆周.内部四分之一圆周具有SKAction,使其围绕其原点/中心永久旋转.

现在这里是问题,只要前景没有任何CIFilter或者具有shouldEnableEffects = NO,一切都很好.也就是说,我可以点击屏幕,我的游戏元素被实例化并添加到主场景中.但是当我尝试将CIGaussianBlur或CIBloom添加到前台时,我注意到两件事:

  1. 帧速率降至约2fps.请注意,即使在场景中只有6个节点存在,也会发生这种情况.
  2. 效果似乎是不断裁剪其内容或调整它的框架.也就是说,如果我有一个节点,"全屏"效果似乎试图不断裁剪或调整其边界到保持所有节点所需的最小区域.这适用于一个节点:

    在此输入图像描述

这适用于2个节点:

在此输入图像描述

在OpenGL ES 2中,人们可以通过基本上将整个帧缓冲区(所有对象)渲染到纹理,然后在该纹理上至少再做一次模糊等传递,然后在附加到的帧缓冲区中呈现它来进行模糊/布局.显示或组合与原始渲染回到帧缓冲区.我希望SKEffectNode以类似的方式工作.然而,裁剪和糟糕的表现让我觉得我可能以错误的方式使用效果节点.有什么想法吗?

Aus*_*den 3

据我所知,这似乎是 SKEffectNode 试图对子 SKShapeNodes 应用过滤器的一个错误。我对此进行了尝试并取得了您的结果,但是当我将 SKShapeNodes 切换为 SKSpriteNodes(使用简单的圆形 png)时,裁剪不再出现。这是一个错误,SKEffectNode 不能很好地处理 SKShapeNode 的笔画。如果您取消描边(lineWidth = 0)并为其指定填充颜色,您将看到没有裁剪。

至于帧速率,SKShapeNodes 表现不佳。当我在屏幕上有 35 个节点(iPhone 5)并且应用了滤镜时,切换到我之前提到的 SKSpriteNodes 将我的 fps 从 40 提高到 50。