【发布时间】:2019-10-14 02:02:48
【问题描述】:
我正在开发的 SceneKit 应用程序遇到了一个相当奇怪的行为。我调用了一个方法来操作各种SCNNode 对象的simdWorldPosition 属性。该方法在一个循环中更改simdWorldPosition,该循环可以执行大约 40k 次。
我定义了一个DispatchQueue:
let updateQueue = DispatchQueue(label: Bundle.main.bundleIdentifier! +
".serialSceneKitQueue")
按下按钮会调用以下命令:
@objc func didPressGreedy() {
updateQueue.async {
let _ = self.Greedy()
}
}
autoreleasepool {
for offset in stride(from: 0.0, through: planeWidth, by: increment) {
var topLeftTransform = arkitAnchor!.simdWorldTransform * HelperMethods.makeTranslationMatrix(tx: -Float(planeWidth / 2), ty: 0.0, tz: -Float(planeHeight/2))
topLeftTransform = topLeftTransform * HelperMethods.makeTranslationMatrix(tx: Float(offset), ty: 0.0, tz: 0.0)
let topEdgePosition = simd_float3(x: topLeftTransform.columns.3.x, y: topLeftTransform.columns.3.y, z: topLeftTransform.columns.3.z)
saLabelComponent.simdWorldPosition = topEdgePosition
let oldSpriteTransform = sprite.simdWorldTransform
for xOffset in stride(from:-0.20, through: 0.20, by: increment) {
for yOffset in stride(from: 0.05, through: 0.20, by: increment) {
LOOP_1_ITERATIONS += 1
var newSpriteTransform = anchor.simdWorldTransform * HelperMethods.makeTranslationMatrix(tx: Float(xOffset), ty: Float(yOffset), tz: 0.0)
sprite.simdWorldTransform = newSpriteTransform
}
}
}
}
这些迭代很慢 - 我有时可以看到大约一千次操作在几秒钟内发生,然后需要一分钟来完成 50 次simdWorldPosition 更新。如果我点击屏幕,我可以看到执行速度加快。
当我使用 iOS App Switcher 时(只需向上滑动 iPhone XS 上的应用程序并将其置于 App Switcher 中),应用程序将迭代的执行速度显着加快了 10 倍。
知道为什么会这样吗?如果我遇到概念问题,请指出相关主题/文章。
【问题讨论】: