2016-09-02 20 views
0

SCNSceneがどれだけロードしているかを示す進捗インジケータを作成するのに苦労しています。 私は、SCNSceneScourceクラスを使用して、Appleのドキュメントに記載されているようにステータスハンドラを取得しようとしました。しかし、これはシーンがロードされたときに私に教えてくれるだけのものです。しかし、これは私が望んでいた情報ではありません - ロード時間とSCNNodeが表示されるまでに必要な時間(ロードされたファイルをグラフィックアダプタのメモリにプッシュするのに必要な時間であると仮定します)シーンキットがシーンをロード中に進捗インジケータが表示される

私のアプローチは、2回のうちの最初のものしか示していません。私は次のようにしました: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

実行時にDAEファイルを読み込んで子ノードをシーンに追加することは最適ではありません。

あなたのiOSのプログラムをコンパイルする前に、あなたの-loadScene方法でやっているすべてのものは、補助プログラムで行うことができます。プログラムでシーンを構築します。 NSCodingを使用してアーカイブします。そのシーンファイルをiOSアプリに埋め込みます。実行時にアーカイブをロードします。

パフォーマンスを向上させるために、(シーンアーカイブを作成する補助プログラムで)ノードを平坦化し、照明を焼き付けてSCNLevelOfDetailインスタンスを作成することができます。あなたのライブアプリでは、prepareObjects:withCompletionHandlerをバックグラウンドで呼び出すことができ、prepareObject:shouldAbortBlock:/NSProgressを使用しないでスピードアップすることができます。

関連する問題