Ios SceneKit优化

Ios SceneKit优化,ios,scenekit,Ios,Scenekit,我想显示相同的scngometry1000次,但要使用特定的动画(例如旋转、移动等动画)和不同的图像作为漫反射材质 在查看文档和漂亮的WWDC演示之后,我发现创建一个节点的最佳方法是(因此称为1000次) 然而,在iPad Air上,我的速度仅为40fps(当使用更新firstMaterial.diffuse.contents的块通过SCNAction设置纹理动画时,速度为27fps) 我认为使用SKTextureAtlas(因此所有图像都在同一纹理上)并使用相同的几何体(显然,当您复制几何体时

我想显示相同的
scngometry
1000次,但要使用特定的动画(例如旋转、移动等动画)和不同的图像作为漫反射材质

在查看文档和漂亮的WWDC演示之后,我发现创建一个节点的最佳方法是(因此称为1000次)

然而,在iPad Air上,我的速度仅为40fps(当使用更新firstMaterial.diffuse.contents的块通过SCNAction设置纹理动画时,速度为27fps)

我认为使用SKTextureAtlas(因此所有图像都在同一纹理上)并使用相同的几何体(显然,当您复制几何体时,数据是共享的-cf),我会获得更多的fps,因为它应该允许OpenGL优化。我尝试使用SceneKit的很多参数,但没有成功

注意:SceneKit统计数据显示有1000个绘图调用,Xcode中的图形统计数据是:cpu 18ms,GPU 22ms,tiler 18%,渲染器80%,设备88%(不能等待Xcode中的新SceneKit统计模块!)

所以我的问题是:你认为这是正常的性能还是有办法优化我想在SceneKit中做的事情?谢谢


编辑:实际上,SKTextureAtlas似乎没有优化渲染,但似乎降低了帧速率。如果我使用UIImage而不是来自SKTextureAtlas的SKTexture,我将获得25%的改进(50fps)。使用SKTextureAtlas或UIImages设置纹理动画(每0.2秒更新每个对象的纹理)确实会降低性能(20fps)。我想我在这里遗漏了一些东西,因为SKTextureAtlas通常用于优化。

1000个draw调用相当多,这可能就是您在CPU上花费18毫秒的原因。渲染利用率高可能是因为纹理采样的数量过多,但很难用这一点来判断。是否还有1000种不同的纹理?纹理有多大?有地图吗?所有几何体对象都是单独设置动画的吗?所以有几个纹理,但在一个图形文件(atlas…)中-大约是70 256*256个图像。只要每个对象都是单独变换的,你几乎必须对每个对象进行一次绘制调用。(这并不完全正确。但这样想可能会有帮助)你试过使用FlattedClone吗?我知道您指出该问题与纹理有关,但SceneKit也存在大量几何体的主要性能问题,通过展平节点图可以大大提高性能,这在一定程度上降低了总体内存消耗(不确定原因),并肯定加快了渲染速度,大概是因为它会在几何体展平后聚合绘制调用。
//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