在scenekit加载场景

时间:2016-09-02 21:27:58

标签: ios objective-c progress-bar scenekit

我正在努力创建一个进度指示器,它将显示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];
        }
}

1 个答案:

答案 0 :(得分:1)

我想提一下,加载你的DAE文件并在运行时将子节点添加到场景中并不是最佳的。

在编译iOS程序之前,您在-loadScene方法中执行的所有操作都可以在辅助程序中完成。以编程方式构建场景。使用NSCoding存档。在iOS应用中嵌入该场景文件。在运行时加载存档。

为了获得更好的性能,您可以(在创建场景归档的辅助程序中)展平节点,创建一些SCNLevelOfDetail实例,烘烤光照。在您的实时应用中,您可以在后台调用prepareObjects:withCompletionHandler,并希望看到足够的加速,使用prepareObject:shouldAbortBlock: / NSProgress是不必要的。

相关问题