理解和优化SceneKit绘制调用

时间:2016-06-07 11:45:53

标签: macos scenekit

我使用SceneKit画出粗线'圆形端盖。 我发现最快的方法是将它们分成3个部分:一个矩形体和两个圆形端盖。 我对SceneKit用于绘制这些线条的绘制调用数量存在问题(或误解)。

我创建了以下场景图:

function()

每个线节点包含3个节点的3个节点。其他节点用于支持其余的数据模型。所有几何都具有相同的材料。

绘制5行需要11次绘制调用。奇怪的是,当我要么省略身体,要么省略两个端盖时,它只需要2次绘制调用。为什么不抽取身体和结束时间需要3或4次抽签? 绘制3076行时问题变得更糟,完全绘制时需要6.15k绘制调用,而只需要对主体或端盖进行10次绘制调用。

我尝试进行测试设置以找到问题,如下所示:

scene's root node -> image node -> sr node -> level node -> line node

首先创建图表的基本部分。然后创建两个几何来表示主体和端盖,然后构造许多线节点。

我注意到如果所有(两个)几何共享完全相同的材料,那么绘制调用计数确实是6.15k。如果shape2具有SCNNode *imageNode=[SCNNode node]; imageNode.name=@"image"; [self.sceneView.scene.rootNode addChildNode:imageNode]; SCNNode *srNode=[SCNNode node]; srNode.name=@"sr"; [imageNode addChildNode:srNode]; SCNNode *levelNode=[SCNNode node]; levelNode.name=@"level"; [srNode addChildNode:levelNode]; NSBezierPath *path1=[NSBezierPath bezierPathWithRect:NSMakeRect(0, 0, 1, 1)]; NSBezierPath *path2=[NSBezierPath bezierPathWithOvalInRect:NSMakeRect(0, 0, 1, 2)]; SCNShape *shape1=[SCNShape shapeWithPath:path1 extrusionDepth:0]; shape1.name=@"cap shape"; SCNShape *shape2=[SCNShape shapeWithPath:path2 extrusionDepth:0]; shape2.name=@"body shape"; for (NSUInteger i=0; i<5; i+=1) { SCNNode *node=[SCNNode node]; node.name=@"line"; SCNNode *node1=[SCNNode nodeWithGeometry:shape1]; node1.name=@"cap"; node1.position=SCNVector3Make(rand()/(float)RAND_MAX*10, rand()/(float)RAND_MAX*10, 0); SCNNode *node2=[SCNNode nodeWithGeometry:shape2]; node2.name=@"body"; node2.position=SCNVector3Make(rand()/(float)RAND_MAX*10, rand()/(float)RAND_MAX*10, 0); node2.scale=SCNVector3Make(2, 6, 1); [node addChildNode:node1]; [node addChildNode:node2]; node1=[node1 copy]; node1.position=SCNVector3Make(rand()/(float)RAND_MAX*10, rand()/(float)RAND_MAX*10, 0); [node addChildNode:node1]; [levelNode addChildNode:node]; } shape1的材质。平局通话数是预期的12。

如何找出使用相同材料进行如此多抽奖调用的原因? 文档明确指出材料旨在重复用于不同的几何形状。

0 个答案:

没有答案