我正在努力创建一个进度指示器,它将显示SCNScene正在加载多少。 我尝试使用SCNSceneScource类来获取苹果公司文档中描述的状态处理程序。但是,这只能告诉我场景何时加载。然而,这不是我想要的信息 - 我想展示总进度,包括加载时间和显示SCNNode所需的时间(我假设是将加载的文件推入图形适配器所需的时间)。记忆)。
我的方法只显示了两次中的第一次。我做了以下操作:我添加了一个SCNView插座(self.skView),一个触发加载场景的按钮和一个UIProgressBar到我的视图。进度条反映了SCNSceneSource的totalProgress属性。
- (void)viewDidLoad {
[super viewDidLoad];
// set up the SCNView
if (_skView.scene==nil) _skView.scene = [SCNScene new];
}
-(void) loadScene {
SCNSceneSource *s = [SCNSceneSource sceneSourceWithURL:[[NSBundle mainBundle] URLForResource:@"Muscles_V04" withExtension:@"dae"] options:nil];
SCNScene *scene = [s sceneWithOptions:nil statusHandler:^(float totalProgress, SCNSceneSourceStatus status, NSError * _Nullable error, BOOL * _Nonnull stop) {
self.proressBar.progress = totalProgress;
NSLog(@"Total progress %.3f",totalProgress);
// once finished remove the status indicator
if (totalProgress>=0.9999) {
[self.proressBar removeFromSuperview];
}
}];
// add the nodes of the loaded scene to the existing scene
for (SCNNode *n in scene.rootNode.childNodes) {
NSLog(@"node: %@", n.name);
[self.skView.scene.rootNode addChildNode:n];
}
}
答案 0 :(得分:1)
我想提一下,加载你的DAE文件并在运行时将子节点添加到场景中并不是最佳的。
在编译iOS程序之前,您在-loadScene
方法中执行的所有操作都可以在辅助程序中完成。以编程方式构建场景。使用NSCoding
存档。在iOS应用中嵌入该场景文件。在运行时加载存档。
为了获得更好的性能,您可以(在创建场景归档的辅助程序中)展平节点,创建一些SCNLevelOfDetail
实例,烘烤光照。在您的实时应用中,您可以在后台调用prepareObjects:withCompletionHandler
,并希望看到足够的加速,使用prepareObject:shouldAbortBlock:
/ NSProgress是不必要的。