2016-12-12 7 views
1

Я собираюсь нарисовать много строк в SceneKit. Я искал способ рисования линий и нашел this answerКак нарисовать десятки тысяч строк в SceneKit?

Это хорошо работает для меня, за исключением того, что оно не подходит для рисования огромного количества линий. Когда я рисую десятки тысяч строк, занятая оперативная память будет ужасной (n Gb).

Мне интересно, если есть способ, я могу нарисовать большое количество строк эффективно. Все, что мне нужно - это 3D-линии, чья координация и длина могут быть разными.

ответ

4

Описанная в вашем referenceed answer правильный метод, вы просто не создавать 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.

+3

Как упоминалось в http://stackoverflow.com/questions/41037428/scenekit-scngeometryelement-trianglestrip-vs-triangles, вы можете пропустить преобразование 'NSData' и использовать' SCNGeometryElement (индексы: primitiveType:) 'для генерации вашего индексный буфер. –

+0

Это именно то, что я ищу! Спасибо! –

+0

Просто для кого-то еще нужно решить подобные проблемы, слишком большое количество строк (например, 300) в одной геометрии приведет к краху вашего приложения. Я не знаю причины, но это происходит. –

 Смежные вопросы

  • Нет связанных вопросов^_^