У меня есть массив мерных размеров, который я хочу визуализировать в 3D, и я использую набор сцен под OS X для него. Я сделал это неуклюже, используя каждый столбец как точку на оси X, каждую строку как точку на оси Z и каждое значение как нормированную точку на оси Y - я помещаю сферу на вектор, определенный каждой точкой данных. Он работает, но он выглядит не слишком хорошо.Проблемы с производительностью с scenekit
Я также сделал это, построив сетку линий на основе функции Матфея в Drawing a line between two points using SceneKit (ответ он отправил, а не оригинальный вопрос). Для каждой точки я использую его функцию, чтобы нарисовать две строки: одну между моей текущей точкой и следующей точкой справа, а другую между моей текущей точкой и следующей точкой в направлении фронта (за исключением случаев, когда нет дополнительного столбца/строки, конечно).
Используя второй метод, мои результаты выглядят намного лучше ... однако производительность довольно отвратительная! Для завершения первоначального рендеринга требуется довольно много времени, и если я использую трекпад/мышь, чтобы повернуть или перевести сцену, я мог бы также выпить чашку кофе, пока моя система снова не будет использоваться (и это не так много гипербола). Используя метод сферы, вещи визуализируются и обновляются очень быстро.
Любые советы по улучшению производительности при использовании метода линий? (Обратите внимание, что я не пытаюсь одновременно добавить обе строки и сферы.) Кодируя, единственная разница между подходами заключается в том, какой из следующих методов вызывается (и что для каждой точки addPixelAt ... вызывается один раз , но addLineAt ... вызывается дважды для большинства точек).
- (SCNNode *)addPixelAtRow:(CGFloat)row Column:(CGFloat)column size:(CGFloat)size color:(NSColor *)color
{
CGFloat radius = 0.5;
SCNSphere *ball = [SCNSphere sphereWithRadius:radius*1.5];
SCNMaterial *material = [SCNMaterial material];
[[material diffuse] setContents:color];
[[material specular] setContents:color];
[ball setMaterials:@[material]];
SCNNode *ballNode = [SCNNode nodeWithGeometry:ball];
[ballNode setPosition:SCNVector3Make(column, size, row)];
[_baseNode addChildNode:ballNode];
return ballNode;
}
- (SCNNode *)addLineFromRow:(CGFloat)row1 Column:(CGFloat)column1 size:(CGFloat)size1
toRow2:(CGFloat)row2 Column2:(CGFloat)column2 size2:(CGFloat)size2 color:(NSColor *)color
{
SCNVector3 positions[] = {
SCNVector3Make(column1, size1, row1),
SCNVector3Make(column2, size2, row2)
};
int indices[] = {0, 1};
SCNGeometrySource *vertexSource = [SCNGeometrySource geometrySourceWithVertices:positions count:2];
NSData *indexData = [NSData dataWithBytes:indices length:sizeof(indices)];
SCNGeometryElement *element = [SCNGeometryElement geometryElementWithData:indexData
primitiveType:SCNGeometryPrimitiveTypeLine
primitiveCount:1
bytesPerIndex:sizeof(int)];
SCNGeometry *line = [SCNGeometry geometryWithSources:@[vertexSource] elements:@[element]];
SCNMaterial *material = [SCNMaterial material];
[[material diffuse] setContents:color];
[[material specular] setContents:color];
[line setMaterials:@[material]];
SCNNode *lineNode = [SCNNode nodeWithGeometry:line];
[_baseNode addChildNode:lineNode];
return lineNode;
}
Нам нужно знать больше о проблемах с производительностью и измерениях, которые у вас есть? Слишком много проблем с вызовами? Слишком много треугольников? Процессор слишком много работает? и т. д. –
Кроме того, вы используете линии по отдельности или просто составляете сетку? (Снимок экрана может быть полезен, чтобы знать, что вы делаете, но это не связано с проблемами производительности) –
@ DavidRönnqvist Я не уверен в ответах здесь, но могу сказать, что это не только мое приложение, которое страдает, когда это происходит, это полная система. Я могу сказать, что даже при использовании метода сферы это примерно за секунду, прежде чем я смогу увидеть сцену после создания моего последнего узла. – mah