我已經有了一行三維數組值,我想要在3D中進行可視化,並且我在OS X下使用了它的場景套件。我以笨拙的方式將每列用作X軸上的一個點,將每一行作爲Z軸上的一個點,將每個值作爲Y軸上的標準化點 - 我將球放在矢量由每個數據點定義。它有效,但看起來不太好。場景包的性能問題
我也通過在Drawing a line between two points using SceneKit(他發佈的答案,而不是原始問題)基礎上構建基於@ Matthew函數的行網格來完成此操作。對於每個點,我使用他的函數繪製兩條線 - 我的當前點和右下一個點之間的一條線,以及當前點和前一個點之間的另一個點(除非沒有額外的列/行,當然)。
使用第二種方法,我的結果看起來好多了......但是性能相當糟糕!完成初始渲染需要相當長的時間,並且如果我使用觸控板/鼠標旋轉或翻譯場景,我還不如拿一杯咖啡等到我的系統再次可用(並且這不是很多誇張)。使用球體方法,事物渲染和更新速度非常快。
有關如何在使用線條方法時提高性能的任何建議? (請注意,我不想同時添加行和球體)。代碼方面,方法之間的唯一區別是調用以下哪個方法(並且對於每個點,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;
}
我們需要了解更多關於性能問題和測量結果的信息嗎?問題是否有太多的平局?太多的三角形? CPU是否做了太多工作? etc. – 2014-10-28 18:54:16
另外,你是單獨使用線還是他們只是組成一個網格? (截圖可能是有用的,知道自己在做什麼,但它沒有相關的性能問題) – 2014-10-28 18:56:30
@DavidRönnqvist我還不能肯定這裏的答案,但我可以說,它不僅是我的應用程序,它受到當發生這種情況,這是完整的系統。我可以說的是,即使在使用球體方法時,在我創建最後一個節點之後,我仍然可以看到場景大約一秒鐘。 – mah 2014-10-28 18:57:04