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")
提案のおかげで@LëshaTurkowski。問題は各ノード1、ノード2、ノード3の更新メソッドにあります。私はCAAnimationを使用してノードに追加しています。私が正しく理解していれば、ノードのアニメーション化可能なプロパティを設定していただけでSCNTransactionのアプローチはうまくいくでしょうか? – leandrodemarco
@leandrodemarco「SCNTransaction」は、シーンを原子的に変更するために使用されます。私が知る限り、アニメーション可能なプロパティで何もする必要はありません。たとえば、Appleはサンプルを使ってノードを親から削除します。私は 'CAAnimation'でそれを使用しようとはしませんでしたが、なぜ動作しないのか分かりません。 –