我想显示相同的SCNGeometry
1000 次,但使用特定的动画(例如用于旋转、移动等的 SCNActions)和不同的图像作为漫反射材料。
在检查文档和漂亮的 WWDC 演示文稿后,我发现创建一个节点的最佳方法是(所以它被称为 1000 次)
//self is a SCNNode
//helper.getStar3D() is a SCNNode template which has been flattened
//the geometry is light (36 triangles according to scenekit statistic)
//need to copy the geometry and material so it is not shared by all nodes
self.geometry=helper.getStar3D().geometry.copy() as SCNGeometry
self.geometry.firstMaterial = helper.getStar3D().geometry.firstMaterial.copy() as SCNMaterial
// texture has been extracted from a SKTextureAtlas
self.geometry.firstMaterial.diffuse.contents=allTextures.firstObject as SKTexture
但是在 iPad Air 上,我只能达到 40 fps(当通过 SCNAction 使用更新 firstMaterial.diffuse.contents 的块为纹理设置动画时为 27 fps)
我认为使用 SKTextureAtlas (所以所有图像都在同一个纹理上)并使用相同的几何体(显然当你复制几何体时,数据是共享的 - cf Building a Game with sceneKit),我会得到更多的 fps 因为它应该允许 OpenGL 优化。我尝试使用 SceneKit 的很多参数,但没有成功。
通知:SceneKit 统计显示有 1000 个绘制调用,Xcode 中的 Graphics stats 是:cpu 18ms,GPU 是 22ms,tiler 18%,renderer 80%,device 88%(等不及新的 SceneKit 统计Xcode 中的模块!)
所以我的问题是:你认为这是正常的性能还是有办法优化我想在 SceneKit 中做的事情?谢谢!
编辑:实际上 SKTextureAtlas 似乎并没有优化渲染,但似乎降低了帧速率。如果我使用 UIImage 而不是来自 SKTextureAtlas 的 SKTexture,我有 25% 的改进(50fps)。使用 SKTextureAtlas 或 UIImages 对纹理进行动画处理(每 0.2 秒更新每个对象的纹理)确实会降低性能(20fps)。我想我在这里遗漏了一些东西,因为 SKTextureAtlas 通常用于优化。