Friday, 31 May 2019

iOS SceneKit application faster in App Switcher Mode

I'm encountering a rather bizarre behavior with a SceneKit application that I am developing. I invoke a method which manipulates the simdWorldPosition property of various SCNNode objects. The method changes the simdWorldPosition in a loop which can execute around ~40k times.

I define a DispatchQueue:

let updateQueue = DispatchQueue(label: Bundle.main.bundleIdentifier! +
        ".serialSceneKitQueue")

A button press calls the following:

@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
            }
        }
    }
}

These iterations are slow - I can sometimes see about a thousand manipulations happen in multiple seconds and then it takes a minute to do 50 simdWorldPosition updates. However, when I use the iOS App Switcher (by just swiping up on the application on iPhone XS and letting it sit in the App Switcher) the application significantly speeds up the execution the iterations by a factor of 10x.

Any idea of why this is caused? If I am having conceptual issues please point to relevant topic/articles.



from iOS SceneKit application faster in App Switcher Mode

No comments:

Post a Comment