【问题标题】:iOS SceneKit application faster in App Switcher ModeiOS SceneKit 应用程序在 App Switcher 模式下更快
【发布时间】: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 倍。

知道为什么会这样吗?如果我遇到概念问题,请指出相关主题/文章。

【问题讨论】:

    标签: ios swift xcode scenekit


    【解决方案1】:

    知道为什么会这样吗?

    听起来您的应用在切换器中的工作量要少得多。这并不奇怪......应用程序绘制的区域要小得多,没有要处理的触摸事件等。差异可能与您循环中的代码关系不大比应用程序的其余部分没有做那么多的事实更能证明这一点。

    如果您真的想知道发生了什么(或没有发生什么),最好的办法是使用 Instruments 分析您的代码。

    【讨论】:

    • 为什么“点击”屏幕会加快执行速度?
    • @oneiros 你没有说任何关于点击的事情。你说让应用程序放在切换器中可以让它运行得更快。我的意思是,在这种模式下,在较小的绘图区域和其他减少的职责之间,应用程序有更多的时间投入到您的代码中。
    • 我忘了把它放在帖子里——由于某种原因,当我点击simdWorldPosition 的扰动时,速度会显着加快。任何想法,根据您的经验,为什么会发生这种情况?
    • @oneiros 根据设备、iOS 版本和设置,当您不主动交互时,操作系统可能会降低处理器速度。在这种情况下,点击会创建交互并导致操作系统再次加速处理器。您可以尝试在设置中关闭低功耗模式(在电池下)。
    猜你喜欢
    • 2015-12-14
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 2019-09-11
    • 1970-01-01
    相关资源
    最近更新 更多