在 iOS 中,为什么 SceneKit 景深比 SpriteKit 快?

In iOS, why does a SceneKit depth of field go faster than a SpriteKit one?

在 SpriteKit 中,您可以使用 SKEffectNode 模糊节点,并将 CIFilter 设置为高斯模糊。

在 SceneKit 中,您可以通过更改场景相机的属性(focalDistancefocalBlurfocalSize)来制作景深模糊。

为什么 SceneKit 的模糊仍然提供一致的 60 FPS,而 SpriteKit 只提供 20 FPS?我正在使用 iPhone 6.

是不是因为SpriteKit的在主线程?

简单!

高斯模糊是一个非常密集的操作。对于 10 半径,它将对 21x21 正方形中的所有像素或 441 个样本进行采样。对于 1080p 高清图像,每帧几乎有十亿个样本。显然可以做很多优化,但总体思路是这样的。

2 通过快速模糊,这可能是 Scenekit 处理景深的方式,有点作弊:着色器不是对正方形进行采样,而是对垂直线(仅在一个轴上进行模糊)进行采样并对其进行模糊处理.第二次通过对模糊图像进行采样,然后在水平轴上进行模糊处理,形成相当不错的模糊效果,每个像素仅使用 41 个样本,或每帧 8500 万个样本。样本减少 90%!

如果考虑采样以外的其他操作,您就会明白为什么 Scenekit 更快。

顺便说一句,使用 CIDiskBlur 会给你比 DOF 高斯模糊更合适的结果。您还可以通过堆叠两个具有 0 度和 90 度角的 CIMotionBlur 来复制 Core Image 中的快速模糊。