2017-11-28 3 views
0

ARSessionでノードを定期的にアニメーション化しようとすると問題が発生します。私は5秒ごとにインターネットからデータを取得しており、そのデータを使ってこのノードを更新します(縮小または拡大)。 私のコードは次のようになります。ARKitでSCNNodeをアニメーション化するためのディスパッチキュー

Timer.scheduledTimer(withTimeInterval: 5, repeats: true) { timer in 
    fetchDataFromServer() { 
     let fetchedData = $0 
     DispatchQueue.main.async { 
      node1.update(fetchedData) 
      node2.update(fetchedData) 
      node3.update(fetchedData) 
     } 
     if stopCondition { timer.invalidate() } 
    } 
} 

問題は、更新を呼び出すときに、私はカメラは一瞬のために凍結しているようだここでグリッチを見ていると私は、次のメッセージが表示されていることですコンソール:[Technique] World tracking performance is being affected by resource constraints [1] アップデートが正常に起こるが、5秒ごとに、私はこれらの「ショートフリーズ」を取得する場合UXは本当にclumpsyある

は私も同時キューを作成しようとしました: let animationQueue = DispatchQueue(label: "animationQueue", attributes: DispatchQueue.Attributes.concurrent) を、代わりにメインQUのanimationQueue.asyncを呼び出しますしかし、問題は続く。 私は何か提案を感謝したいと思います。

編集:それにサブノードのそれぞれがupdate方法は、シーンの使用SCNTransactionにすべての更新を行うには、この

private func growingGeometryAnimation(newHeight height: Float) -> CAAnimation{ 
    // Change height 
    let grow = CABasicAnimation(keyPath: "geometry.height") 
    grow.toValue = height 
    grow.fromValue = prevValue 

    // .... and the position 
    let move = CABasicAnimation(keyPath: "position.y") 
    let newPosition = getNewPosition(height: height) 
    move.toValue = newPosition.y + (yOffset ?? 0) 

    let growGroup = CAAnimationGroup() 
    growGroup.animations = [grow, move] 
    growGroup.duration = 0.5 
    growGroup.beginTime = CACurrentMediaTime() 
    growGroup.timingFunction = CAMediaTimingFunction(
     name: kCAMediaTimingFunctionEaseInEaseOut) 
    growGroup.fillMode = kCAFillModeForwards 
    growGroup.isRemovedOnCompletion = false 

    growGroup.delegate = self 

    return growGroup 
} 
self.addAnimation(growingGeometryAnimation(newHeight: self.value), forKey: "bar_grow_animation") 

答えて

0

のように見えるのです、それは確かにすべての変更が適切なスレッドで作られています。

Timer.scheduledTimer(withTimeInterval: 5, repeats: true) { timer in 
    fetchDataFromServer() { 
     let fetchedData = $0 

     SCNTransaction.begin() 
     node1.update(fetchedData) 
     node2.update(fetchedData) 
     node3.update(fetchedData) 
     SCNTransaction.commit() 

     if stopCondition { timer.invalidate() } 
    } 
} 
+0

提案のおかげで@LëshaTurkowski。問題は各ノード1、ノード2、ノード3の更新メソッドにあります。私はCAAnimationを使用してノードに追加しています。私が正しく理解していれば、ノードのアニメーション化可能なプロパティを設定していただけでSCNTransactionのアプローチはうまくいくでしょうか? – leandrodemarco

+0

@leandrodemarco「SCNTransaction」は、シーンを原子的に変更するために使用されます。私が知る限り、アニメーション可能なプロパティで何もする必要はありません。たとえば、Appleはサンプルを使ってノードを親から削除します。私は 'CAAnimation'でそれを使用しようとはしませんでしたが、なぜ動作しないのか分かりません。 –

関連する問題