在 SceneKit 中加速渲染

Posted

技术标签:

【中文标题】在 SceneKit 中加速渲染【英文标题】:Speeding up rendering in SceneKit 【发布时间】:2016-02-09 14:13:48 【问题描述】:

所以,我使用 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 完成了同样的项目,并且能够很好地使用轨道摄像机,所以我不敢相信场景套件至少无法与之竞争。我可以调整和关闭哪些功能以提高性能?我使用的是三角形基本类型,轨道摄像机使用allowCameraControl = true,SCNView使用metal。

对于那些好奇的人,我正在努力研究的模型为面生成了 231,900 个顶点和 347,850 个索引(11.1312 MB 的顶点数据(位置和法线)和 1.3914 MB 的面数据(基本上只是顶点的索引位置,以便用于三角形)。 ))

【问题讨论】:

在 iPad 3 或更早版本上,这已接近顶点限制。再加上你用尽的填充率,你可能会很难达到 60fps,但应该不会太远。 500ms确实不正常。 我的旧 4s 过去常常以 20fps 左右的速度处理这些数字。您的伪代码看起来不错,这就是我生成几何图形的方式。在不同的时间里,我会弄乱索引,导致屏幕上的多面混乱。这真的会影响帧率,我把它归结为片段着色器必须做更多的工作。我会仔细检查网格,也许让它半透明并打开线框svnView.debugOptions = .ShowWireframe 如何手动更改填充率? 您可以通过应用完全透明的材质来完全“禁用”过滤,这样您就可以将几何图形的成本与材质渲染隔离开来。甚至“空”材料也可能导致这种情况。我不完全确定......但应该有一种方法可以在没有任何纹理/皮肤/材料的情况下测试几何性能。 【参考方案1】:

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

话虽如此,231,900 个顶点确实不多,我在 OSX 上使用 SceneKit Metal 渲染器(比使用 OpenGL 渲染器快 20%)以 60fps 的速度绘制了几百万个顶点。

2) 如果您从远处观察表面并且性能不佳,请检查您在创建 SCNGeometrySource 时喂食的 bytesPerComponent: 数量。在 GeForce GTX 上使用 CGFloat(双精度)而不是普通浮点时,我的性能大幅下降(而在集成英特尔显卡上还可以)。

【讨论】:

以上是关于在 SceneKit 中加速渲染的主要内容,如果未能解决你的问题,请参考以下文章

SceneKit 模型的恒定旋转

iOS10 + SceneKit:使用自定义着色器渲染视频

将scenekit和spritekit组合在一个屏幕中

高质量渲染——RealityKit vs SceneKit vs Metal

如何从代码在 SceneKit 中设置基于物理的渲染?

Xcode 的 SceneKit 编辑器渲染 .dae 文件错误,Xcode 有时在预览期间崩溃