我有4000个对象的场景(1000个对象可见),全部使用相同的材质(通过将自定义创建的SCNGeometry的firstMaterial属性分配给相同的SCNMaterial对象)以60FPS运行(1000个绘制调用,150k个三角形,Metal flush 〜12毫秒)。
现在我想改变渲染我的素材。使用着色器修改器一切正常,性能相同,但我需要完全替换SceneKit的渲染,所以我使用SCNProgram与Metal顶点和片段着色器(尝试了非常基本和转储的SceneKit'默认着色器)。当我将该程序分配给我的材料时,一切都按预期工作,除了巨大的性能下降 - 统计显示20FPS,4000个绘制调用,600K三角形,金属冲洗~30ms。
所以,似乎有些工作做了好几次。也许有人知道问题的根源在哪里?
修改
似乎我缩小了问题。这会影响OpenGL和Metal着色器:在使用自定义SCNProgram
时,我会失去视锥体剔除。在默认的SceneKit Metal着色器中,我看到:
typedef struct {
...
#ifdef USE_BOUNDINGBOX
float2x3 boundingBox;
#endif
...
} commonprofile_node;
传递给顶点和片段着色器,但不在任何地方使用。由于默认着色器没有视锥体剔除代码,因此可能应该在其他地方进行。