objective-c – SceneKit Cocoa添加贴花

有没有足够的方法将贴花(纹理)添加到SCNNode?

现在我所能做的就是使用SCNPlane几何创建新的SCNNode

为它的漫反射内容指定一个纹理并将其添加到场景中……

这种方法非常低效.

我想添加一个不会成为场景一部分的贴花 – 以提高游戏性能.
因为我想在楼层节点上有相对大量的贴花.

也许有点类似于粒子内部如何工作?
或者其他一些快速图像绘制方法.

我已经尝试过@ rickster的建议1号

Use SKEffectNode as a buffer in the SpriteKit scene — throw splatters
into an effect node until it gets to a certain number of children,
then turn on its shouldRasterize option so that it doesn’t re-render
its children anymore (and start using a new effect node for more
splatters).

在完全相同的SceneKit showreel项目中 – 仅此一项已经取得了不错的成绩,FPS并没有因为5分钟继续播放这样的场景而下降.

期待实施建议#2
– 我相信它会缩短2D场景渲染时间(现在这是一个非常大的问题).

在这个屏幕截图中有5k贴花

《objective-c – SceneKit Cocoa添加贴花》

最佳答案 我建议使用SpriteKit场景作为“splattered-on”几何体的材质. Apple拥有
sample code,它展示了你在这里要做的很多事情:

>创建一个SpriteKit场景,它是SceneKit几何体的材质.
>当3D世界中的某些东西需要制作飞溅时,使用命中测试来查找材质中的纹理坐标并将其转换为SpriteKit场景坐标.
>将精灵放在该位置的SpriteKit场景中以创建贴花.

从你的other question判断,你似乎已经开始朝着这个方向前进……如果你解决更多的问题,也许你会得到更好的帮助?

注意:该示例代码在iOS 9 / macOS 10.11及更高版本上有一个错误,它会干扰飞溅效果.你可以通过在AAPLGameViewController.m中找到这一行来解决它:

    ball.physicsBody.collisionBitMask = ~(0x4);

并在其后添加此行:

    ball.physicsBody.contactTestBitMask = ~(0x4);

您可能会在该演示中注意到,经过一段时间后,您的帧速率开始下降 – SpriteKit场景中不断增加的精灵数量使得2D渲染会越来越多地占用渲染循环.

《objective-c – SceneKit Cocoa添加贴花》
(也许这是促使你other question的问题?)

但是,有一些方法可以针对这种情况进行优化,即使没有“截屏”纹理的能力.一些调查的想法:

>使用SKEffectNode作为SpriteKit场景中的缓冲区 – 将泼溅投射到效果节点,直到达到一定数量的子节点,然后打开其shouldRasterize选项,使其不再重新渲染其子节点(并开始使用更多泼溅的新效果节点).
>很多2D时间都浪费了绘制SK精灵,因为它们被埋在其他精灵之下而不可见. (或者大多数都是埋藏的,并且只有几个像素可见.)因为你的,嗯,“绘画”是完全相同的颜色,你可以使用一些简单的方法将你的SpriteKit场景分成几个区域并决定一个区域是什么时候完全覆盖 – 此时,您可以从该区域删除所有精灵,用一个“全覆盖”精灵替换它们,并停止在该区域添加新的精灵. quadtree可能是一个很好的工具.
>如果您想通过着色器修改器而不是使用基于SpriteKit的材质进行自定义绘制,则SceneKit对纹理坐标映射技巧的命中测试也可以正常工作,您可能能够找到更有效的长期覆盖方式跟踪那里(可能是#3中的一些技巧).
>如果您的飞溅不常发生,您可以在CPU上渲染它们并在材质上设置新图像.
>一个想法的远景,不知道它是否有效或高效:使用Core Image as an accumulation buffer绘制泼溅物,并将其渲染到材料内容设置为的相同MTLTexture中. (使用SceneKit的willRenderScene回调每帧渲染一次.)

点赞