加速在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性能?我使用了三个参数:三角形原语类型、allowsCameraControl=true (用于旋转相机),以及SCNView的金属特性。我在WebGL中使用Three.js完成了同样数量的数据的相同项目,并且可以很好地使用旋转相机,因此我不相信Scene Kit无法至少与其竞争。我可以调整和关闭哪些功能以加速性能呢?对于那些好奇的人,我正在努力处理的模型生成了231,900个顶点和347,850个面索引(11.1312MB的顶点数据(位置和正常)和1.3914MB的面数据(基本上只是三角形中顶点的索引位置)。)


在iPad 3或更早版本上,这已经接近顶点限制了。加上你使用的填充率,你可能会很难达到60fps,但不应该差太远。500毫秒确实异常。 - Confused
1
我的旧4s处理那些数字时大约以20fps处理。你的伪代码看起来不错,这就是我生成几何图形的方式。有时我会搞混指数,导致屏幕上出现凹面杂乱。这会真正影响帧率,我认为这是由于片段着色器需要做更多的工作。我会仔细检查网格,也许将其设为半透明,并打开线框模式svnView.debugOptions = .ShowWireframe - lock
我如何手动更改填充率? - Red
你可以通过应用完全透明的材料来完全“禁用”过滤器,这样你就可以将几何成本与材料渲染隔离开来。甚至一个“空”材料也可以达到这个效果。我不是完全确定...但应该有一种方法可以在没有任何纹理/皮肤/材料的情况下测试几何性能。 - Confused
1个回答

3

1) 如果您在生成的表面中心“站立”,那么您的问题可能是您绘制了很多屏幕外的内容(没有视锥剪裁),因此您需要将表面(单个节点)分成子表面(子节点),以便仅绘制在相机视图空间中可见的节点。

话虽如此,231,900个顶点实际上并不多,我使用SceneKit Metal渲染器(比使用OpenGL渲染器快20%)在OSX上每秒绘制数百万个顶点。

2) 如果您从远处查看表面并且性能不佳,请检查在创建SCNGeometrySource时提供的bytesPerComponent:数量。当在GeForce GTX上使用CGFloat(双精度)而不是纯浮点数时,我的性能大幅下降(在集成的英特尔图形上还好)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接