CIGaussianBlur处理过程太耗费资源

5
我正在尝试在游戏暂停屏幕上应用CIGaussianBlur效果,以下是我的代码:

effectsNode = SKEffectNode();
let filter = CIFilter(name: "CIGaussianBlur");
let blurAmount = 10.0;
filter.setValue(blurAmount, forKey: kCIInputRadiusKey);

effectsNode.filter = filter;
effectsNode.blendMode = .Alpha;

这段代码运行正常,但它需要太多的处理能力,大大降低了帧数(FPS)! 当游戏暂停时,我只想要一个静态模糊的背景图像。

有没有解决这个问题的方法?


1
尝试使用shouldRasterize属性(或类似的属性,因为它的名称中包含“rasterize”)。 - CodeSmile
@LearnCocos2D 我希望我早点看到这个,不管怎样,我按照答案提到的帖子进行了跟进,在稍微调整一下后就让它正常工作了 :) 我拍了一张屏幕截图并应用了模糊效果,哪种替代方法的内存消耗最小?栅格化还是拍摄屏幕截图并对其进行模糊处理? - Adnan Zahid
1个回答

1
你是在每一帧上应用效果吗?你只需要应用一次,然后保存结果,在暂停时显示该结果。你可以在此帖子中看到一个例子。

非常好用!谢谢 :) - Adnan Zahid
2
虽然链接的答案是那个问题的被接受的答案,但它并不是最有效的解决方案——没有必要将图像数据从SpriteKit(在GPU内存中)回传到UIKit(在CPU内存中)应用滤镜并将其放回Spritekit。同一问题的另一个答案演示了使用SKEffectNodeshouldRasterize选项,以便模糊滤镜仅应用一次,而不是每次绘制都应用。(实际上,60fps的全屏模糊对于某些硬件来说太多了。) - rickster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接