所以,我使用SceneKit渲染一组参数曲面(其总和构成一个对象)。为了将这些放在屏幕上,我通过采样点和创建三角形来创建自定义几何。这是我如何做到这一点的快速视图。
Loop through the collection of surfaces
Generate a random color C
For each surface calculate a grid of N x N points (both positions and normals)
Assign all vertexes for that surface the color C
Add groups of 3 vertexes from this surface to the face index list
这似乎有效。获得所有这些数据后,我将其转换为正确的结构(SCNGeometrySource和SCNGeometryElement)并制作SCNGeometry,如此
SCNGeometry(sources: [vertexSource, normalSource, colorSource], elements: [element])
这可以在屏幕上显示我的曲面作为单个几何元素。我的问题是,我有一些非常复杂的对象,我正在尝试使用它,并且只是在查看对象时移动相机的速度非常慢。渲染大约需要500毫秒。这使我的帧速率和体验变得糟糕。
所以问题是,我可以采取哪些步骤来加速SceneKit的性能?我使用具有相同数据量的Three.js的WebGL做了同样的项目,并且能够使用轨道相机,所以我不能相信场景套件至少不能与之竞争。我可以调整和关闭哪些功能以加快性能?我使用的是三角形基本类型,轨道相机的allowsCameraControl = true,以及SCNView的金属。
对于那些好奇的人,我正在努力的模型为面部生成了231,900个顶点和347,850个索引(11.1312 MB的顶点数据(位置和法线)和1.3914 MB的面部数据(基本上只是顶点的索引位置以便为三角形)。 ))
答案 0 :(得分:3)
1)如果你“站在”你生成的表面的中心,那么你的问题可能是你在屏幕外绘制很多(没有视锥体剔除),你需要将你的sufrface(单节点)分成地下(子节点),因此,只绘制在摄像机视图空间中可见的节点。
话虽这么说,231,900个顶点实际上并不多,我在OSX上用SceneKit Metal渲染器(比使用OpenGL渲染器快20%)绘制了几个60英尺/ 60fps。
2)如果您从远处观察表面并且表现不佳,请在创建bytesPerComponent:
时检查您喂食的SCNGeometrySource
的大小。在GeForce GTX上使用CGFloat(双倍)代替普通浮动时,我的性能下降很大(在集成的英特尔图形上可以正常使用)。