如何申请全屏SKEffectNode后期处理中SpriteKit

问题描述:

我尝试SpriteKit具有以下设置:如何申请全屏SKEffectNode后期处理中SpriteKit

  1. 的SKScene与仅用于分组其他 节点两个子节点:前景和背景。
  2. 背景现在真的是空的,但最终会保留一些 类型的背景精灵/图层。
  3. 前景是SKEffectNode并且每当用户轻敲 屏幕,SKnode子类表示游戏 元素被添加作为子给它的一个新intance上。
  4. 该SKNode子类基本上创建3个SKShapeNodes和两个标签:外围 圆周,内圆周,2个标签和内四分之一圆周。内部四分之一圆周有一个SKYction,它使得它永远围绕其原点/中心旋转。

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

  1. 帧速下降到大约2fps。请注意,这种情况即使在场景中只有6个节点活动的情况下也会发生。
  2. 效果似乎不断裁剪其内容或调整 它的框架。也就是说,如果我有一个节点,那么“全屏”效果似乎会尝试并不断裁剪或调整其边界,以保持所有节点所需的最小面积 。这是一个节点:

    enter image description here

这是2个节点:

enter image description here

在OpenGL ES中2,一个将被基本呈现做后模糊/大整个帧缓冲区(所有对象)进行纹理处理,然后对该纹理执行至少一次以上模糊等处理,然后将其呈现在附着在显示器上的帧缓冲区中,或者将其与原始渲染进行组合,然后将其渲染回帧缓冲区。我希望SKEffectNode以类似的方式工作。然而,裁剪和糟糕的表现让我觉得我可能以错误的方式使用效果节点。有什么想法吗?

它似乎是一个SKEffectNode尝试应用筛选器在儿童SKShapeNodes上的错误,据我所知。我玩过这个并获得了结果,但是当我切换SKSpriteNodes的SKShapeNodes(使用一个简单的png圆)时,裁剪不再出现。这是一个错误,因为SKEffectNode无法很好地处理SKShapeNode的笔画。如果你取下笔画(lineWidth = 0)并给它一个填充颜色,你会看到没有剪裁。

至于帧率,SKShapeNodes表现不佳。切换到前面提到的SKSpriteNodes时,我在屏幕(iPhone 5)上应用了过滤器的35个节点时,将我的fps从40增加到了50。

+1

现在我想到了,可能有一个解决方法:SKView由CAEAGLLayer支持,甚至有一个返回SKTexture的-textureFromNode属性。如果我设置自己的GL着色器进行模糊/模糊处理,我可以抓取每一帧(通过属性或者甚至通过使用我自己的OpenGL上下文切入图层本身),后处理它并将其呈现回SKView的图层或新的CAEAGLLayer。 – SaldaVonSchwartz

+1

你可以评论这个解决方法是否有效吗?我试图弄清楚你是否可以使用Sprite Kit做你自己的后期处理效果? – Oscar