在 SceneKit 中加速渲染
Speeding up rendering in SceneKit
所以,我正在使用 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 的面数据(基本上只是顶点的索引位置,以便三角形。))
1) 如果你 "standing" 在你生成的表面的中心,那么你的问题可能是你在屏幕外绘制了很多(没有截锥体剔除)并且你需要将你的表面(单个节点)分割成子表面(子节点),因此仅绘制在相机视图 space 中可见的节点。
也就是说,231,900 个顶点确实不多,我在 OSX.
上使用 SceneKit Metal 渲染器(比使用 OpenGL 渲染器快 20%)绘制了几百万 @60fps
2) 如果您从远处观察您的表面并且表现不佳,请检查您在创建 SCNGeometrySource
时喂入了多少 bytesPerComponent:
。在 GeForce GTX 上使用 CGFloat(双精度)而不是普通浮点时,我的性能大幅下降(但在集成英特尔显卡上没问题)。
所以,我正在使用 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 的面数据(基本上只是顶点的索引位置,以便三角形。))
1) 如果你 "standing" 在你生成的表面的中心,那么你的问题可能是你在屏幕外绘制了很多(没有截锥体剔除)并且你需要将你的表面(单个节点)分割成子表面(子节点),因此仅绘制在相机视图 space 中可见的节点。
也就是说,231,900 个顶点确实不多,我在 OSX.
上使用 SceneKit Metal 渲染器(比使用 OpenGL 渲染器快 20%)绘制了几百万 @60fps2) 如果您从远处观察您的表面并且表现不佳,请检查您在创建 SCNGeometrySource
时喂入了多少 bytesPerComponent:
。在 GeForce GTX 上使用 CGFloat(双精度)而不是普通浮点时,我的性能大幅下降(但在集成英特尔显卡上没问题)。