如何在Scenekit中绘制成千上万的线条



我将在SceneKit中绘制很多行。我搜索了如何绘制线条并找到了这个答案

它对我来说很好,除了它不适合绘制大量线条。当我绘制成千上万的线条时,被占领的公羊将是可怕的(N GB)。

我想知道是否有一种方法可以有效地绘制大量线路。我只需要3D行,其从对协调和长度可能有所不同。

您的参考答案中描述的方法是正确的,您只是没有为每行创建SCNGeometrySource/SCNGeometryElement/SCNNode,只需填写数组:

SCNVector3 positions[] = {
    SCNVector3Make(0.0, 0.0, 0.0),    // line1 begin  [0]
    SCNVector3Make(10.0, 10.0, 10.0), // line1 end    [1]
    SCNVector3Make(5.0, 10.0, 10.0),  // line2 begin  [2]
    SCNVector3Make(10.0, 5.0, 10.0)   // line2 end    [3]
};
int indices[] = {0, 1, 2, 3};
              // ^^^^  ^^^^
              // 1st   2nd
              // line  line

,然后从NSData中创建几何源:

NSData *data = [NSData dataWithBytes:positions length:sizeof(positions)];
SCNGeometrySource *vertexSource = [SCNGeometrySource geometrySourceWithData:data
                                            semantic:SCNGeometrySourceSemanticVertex
                                         vectorCount:POSITION_COUNT
                                     floatComponents:YES
                                 componentsPerVector:3 // x, y, z
                                   bytesPerComponent:sizeof(CGFloat) // size of x/y/z/ component of SCNVector3
                                          dataOffset:0 
                                          dataStride:sizeof(SCNVector3)*2]; // offset in buffer to the next line positions

如果您有10000行,则您的位置缓冲区将为2*3*10000*8 = 480KB ,以及索引2*10000*4 = 80KB ,哪个对于GPU来说真的不多。

,如果您可以减少索引和/或位置的长度,甚至可以进一步降低缓冲区。例如,如果您的所有坐标都是范围内的整数-127..128,那么通过floatComponent:NO, bytesPerComponent:1将使位置缓冲区减少到 60KB )。

当然,如果您的所有线都具有相同的材料属性,这是适用的。否则,您必须在SCNGeometrySource/SCNGeometryElement/SCNNode中具有相同属性的所有行分组。

相关内容

  • 没有找到相关文章

最新更新