是否有足够的方法在SCNNode中添加贴花(纹理)?
现在,我所能做的就是用SCNNode几何图形创建新的SCNPlane为其漫反射内容分配纹理并将其添加到场景中...
这种方法效率极低。

我想添加一个不属于场景的贴花-以提高游戏的性能。
因为我想在地板节点上放置相对大量的贴花。

也许有点类似于粒子内部的工作原理?
或其他一些快速图像绘制方法。

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



在同一个SceneKit showreel项目中-仅此一项就已经取得了不错的效果,FPS在持续播放场景的过程中并没有像连续5分钟那样下降。

期待实现建议2
-我相信它将减少2D场景渲染时间(目前这是一个很大的数目)。

在此屏幕快照中,有5k贴花

objective-c - SceneKit cocoa 贴花-LMLPHP

最佳答案

我建议使用SpriteKit场景作为“飞溅”几何图形的 Material 。苹果公司的sample code可以说明您在这里要做什么的很多事情:

  • 制作一个SpriteKit场景,该场景是SceneKit几何的 Material 。
  • 当3D世界中的某些物体需要飞溅时,请使用 HitTest 在 Material 中查找纹理坐标,并将其转换为SpriteKit场景坐标。
  • 将Sprite放置在SpriteKit场景中的该位置以创建贴花。

  • other question来看,您似乎已经开始朝这个方向发展……如果您解决更多问题,也许会得到更好的帮助?

    注意:该示例代码在iOS 9/macOS 10.11及更高版本上存在一个错误,该错误会干扰飞溅效果。您可以通过在AAPLGameViewController.m中找到以下行来解决此问题:
        ball.physicsBody.collisionBitMask = ~(0x4);
    

    并在其后添加此行:
        ball.physicsBody.contactTestBitMask = ~(0x4);
    

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

    objective-c - SceneKit cocoa 贴花-LMLPHP
    (也许这是提示您other question的问题?)

    即使没有“截屏”纹理的功能,也有一些方法可以针对这种情况进行优化。需要调查的一些想法:
  • 在SpriteKit场景中将SKEffectNode用作缓冲区—将splatters扔到一个效果节点中,直到到达一定数量的子代为止,然后打开其 shouldRasterize 选项,以使其不再重新渲染其子代(并开始使用新效果节点以获取更多效果)。
  • 大量的2D时间浪费在绘制看不见的SK子画面上,因为它们被埋在其他子画面下。 (或者大部分被掩埋,并且只有几个像素可见。)由于您的“绘画”是相同的颜色,因此您可以使用一些简单的方法将您的SpriteKit场景分成多个区域,并确定何时将一个区域完全覆盖-到那时,您可以从该区域中删除所有子画面,将它们替换为一个“全部覆盖”子画面,然后停止在该区域中添加新的子画面。 quadtree可能是在这里使用的好工具。
  • 如果您想通过着色器修改器(而不是基于SpriteKit的 Material )进行自定义绘制,那么SceneKit的“ HitTest 到纹理坐标映射”技巧同样有效。并且,您也许能够找到一种更有效的长期覆盖方式跟踪到那里(可能在#3中的一些技巧的帮助下)。
  • 如果不经常发生飞溅,则可以在CPU上渲染它们,并在 Material 上设置一个新图像。
  • 一个想法的远景,不知道它会起作用还是表现出色:使用Core Image as an accumulation buffer绘制喷溅,并将其渲染为与 Material 内容设置相同的MTLTexture。 (使用SceneKit的willRenderScene回调每帧渲染一次。)
  • 关于objective-c - SceneKit cocoa 贴花,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40913688/

    10-14 12:20