我目前正在测试将SceneKit用于我想制作的游戏的可行性,但是在确定如何最好地在SceneKit中创建许多类似几何对象的网格同时保持可接受的性能时也是如此 . 这是我想做的事情:

  • 放置数百个几何图元,现在只是一个普通的立方体在网格中 .

  • 将各种顶点和/或曲面和/或片段着色器应用于每个立方体 . 一些立方体可能会应用相同的着色器,但实际上我希望至少有几十种不同的着色器可以应用于立方体 .

  • 我希望能够将相机缩小并同时查看所有立方体,同时保持平滑的帧速率 .

我开始使用25个立方体,25个立方体的网格 . 通过使用单个SCNBox对象为几何体构建循环中的网格并设置 firstMaterial 属性的 shaderModifiers 属性,我获得了良好的性能 . 我将所有625个立方体添加到节点,然后将此节点的 flattenedClone() 添加到场景的根节点 . 这意味着只需1次绘制调用即可渲染整个场景 .

但是,重用几何体的问题是所有立方体都必须使用相同的着色器 . 但是如果我为每个立方体创建一个新的SCNBox(这样我就可以为每个立方体单独设置着色器),那么我最终会为每个立方体进行绘制调用,这样效率很低,当越来越多的立方体时性能会受到影响被添加到场景中 . 如果几何体比立方体更复杂,则性能会严重下降 .

当然,我可以优化并使用任何使用相同着色器共享相同几何体的立方体,将它们添加到自己的节点并将该节点的 flattenedClone() 添加到场景中 . 但在这种情况下,我能做些什么来优化?或者我最好完全寻找SceneKit的替代品?