【发布时间】:2018-05-11 09:41:22
【问题描述】:
我在尝试定期为 ARSession 上的节点设置动画时遇到问题。我每 5 秒从 Internet 获取数据,然后使用该数据更新此节点(缩小或放大)。 我的代码如下所示:
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 秒我得到这些“短暂的冻结”,用户体验真的很笨拙
我也尝试过创建一个并发队列:
let animationQueue = DispatchQueue(label: "animationQueue", attributes: DispatchQueue.Attributes.concurrent)
并调用animationQueue.async 而不是主队列,但问题仍然存在。
如有任何建议,我将不胜感激。
编辑:update 方法上的每个子节点看起来像这样
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")
【问题讨论】:
标签: swift grand-central-dispatch scenekit arkit