所以,我使用 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 使用相同数量的数据进行了同样的项目,并且能够使用轨道相机,所以我无法相信场景套件至少无法与之竞争。我可以调整和关闭哪些功能以加快性能?我使用的是三角形基本类型,轨道相机的 allowsCameraControl = true,以及 SCNView 的金属。
对于那些好奇的人,我正在努力的模型为面部生成 231,900 个顶点和 347,850 个索引(11.1312 MB 的顶点数据(位置和法线)和 1.3914 MB 的面部数据(基本上只是顶点的索引位置,以便 triangles.))
1 回答
话虽这么说,231,900 个顶点真的不多,我在 OSX 上用 SceneKit Metal 渲染器(比使用 OpenGL 渲染器快 20%)绘制了几个数百万@60fps。
SCNGeometrySource
时检查您正在进给的bytesPerComponent:
。在 GeForce GTX 上使用 CGFloat(双倍)而不是普通浮动时,我的性能下降很大(在集成的英特尔显卡上可以正常使用)。