首页 文章

在 SceneKit 中加速渲染

提问于
浏览
10

所以,我使用 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 回答

  • 3
    1. 如果你“站在”你生成的表面的中心,那么你的问题可能是你在屏幕外绘制很多(没有视锥体剔除)并且你需要将你的 sufrface(单节点)分成地下(子节点),所以只有节点是可见在相机视图空间中绘制。

    话虽这么说,231,900 个顶点真的不多,我在 OSX 上用 SceneKit Metal 渲染器(比使用 OpenGL 渲染器快 20%)绘制了几个数百万@60fps。

    1. 如果您从远处观察表面并且表现不佳,请在创建SCNGeometrySource时检查您正在进给的bytesPerComponent:。在 GeForce GTX 上使用 CGFloat(双倍)而不是普通浮动时,我的性能下降很大(在集成的英特尔显卡上可以正常使用)。

相关问题