【发布时间】:2014-12-24 07:14:13
【问题描述】:
我有一个行维值数组,我想在 3D 中可视化,我正在使用 OS X 下的场景工具包。我以笨拙的方式完成了它,将每一列用作 X 轴上的一个点,每一行用作 Z 轴上的一个点,每个值作为 Y 轴上的一个归一化点——我在每个数据点定义的向量。它可以工作,但看起来不太好。
我还通过基于@Matthew 在Drawing a line between two points using SceneKit 中的函数构建线网格来完成此操作(他发布的答案,而不是原始问题)。对于每一点,我使用他的函数绘制两条线——一条在我当前点和下一个点之间,另一条在我当前点和下一个点之间(当然,除非没有额外的列/行)。
使用第二种方法,我的结果看起来好多了……但是性能非常糟糕!完成初始渲染需要相当长的时间,如果我使用触控板/鼠标旋转或平移场景,我还不如喝杯咖啡等到我的系统再次可用(这并不多)夸张)。使用 sphere 方法,事物的渲染和更新速度非常快。
关于如何在使用 lines 方法时提高性能有什么建议吗? (请注意,我不是试图同时添加线条和球体。)在代码方面,方法之间的唯一区别是调用以下哪个方法(并且对于每个点, 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做的工作太多了吗?等
-
另外,您是单独使用这些线还是它们只是组成一个网格? (屏幕截图可能有助于了解您在做什么,但与性能问题无关)
-
@DavidRönnqvist 我对这里的答案并不肯定,但我可以说,当这种情况发生时,不仅我的应用程序会受到影响,整个系统都会受到影响。我能说的是,即使使用 sphere 方法,在创建最后一个节点后,大约需要一秒钟才能看到场景。
-
我的台词是单独创建的;我有 10,000 个数据点,所以有 20k 行。
-
如果你在视图上打开
showsStatistics,这会告诉你什么?