【问题标题】:SKView integrated into UIViewController with UITextFields laggingSKView 集成到 UIViewController 与 UITextFields 滞后
【发布时间】:2018-09-03 23:24:20
【问题描述】:

我正在尝试在我的登录 UI 中使用 SKView 来制作一些动画。 SKView 作为子视图添加到 LoginContainerView 以及包含 UITextFields 和登录按钮的视图。所有子视图都使用自动布局定位,并且附加到 SKView 的 FireScene 的 scaleMode 设置为 .resizeFill。

从这段视频中可以清楚地看到我遇到的问题:https://streamable.com/5it17。

剪辑说明:每当我双击任何 UITextFields(触发 UIMenuController / Paste 按钮)FireScene 冻结短暂 时间量(但它非常明显)并且 FPS 在 1-2 秒内下降到 30 左右。

FireScene 添加为其子节点的唯一节点是修改后的萤火虫 SKEmitterNode 模板。我相当确定这与实际代码无关(因为它非常简单明了),并且可能是 UIKit 与 SpriteKit 错误混合。

相关代码:

class FireScene: SKScene {

    // MARK: - Properties
    var fireSparkEmitter: SKEmitterNode? = nil

    // MARK: - Inherited
    override func didChangeSize(_ oldSize: CGSize) {
        // position the emitter to scene's center
        fireSparkEmitter?.position = CGPoint(x: size.width/2, y: size.height/2)
    }

    override func didMove(to view: SKView) {
        if let emitter = fireSparkEmitter {
            emitter.resetSimulation()
        } else {
            guard let emitter = SKEmitterNode(fileNamed: "FireSparks.sks") else { return }
            addChild(emitter)
            fireSparkEmitter = emitter
        }

    }
}

class LoginContainerView: UIView {
    /// ...
    let fireBackgroundScene: FireScene = {
        let scene = FireScene(size: .zero)
        scene.scaleMode = .resizeFill
        return scene
    }()
    /// ...

    // MARK: - Inherited
    // called after view initialization
   func setupSubviews() {
        let skView = SKView(frame: .zero)
        skView.translatesAutoresizingMaskIntoConstraints = false
        addSubview(skView)
        skView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
        skView.topAnchor.constraint(equalTo: topAnchor).isActive = true
        skView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
        skView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true

        skView.showsFPS = true
        skView.presentScene(fireBackgroundScene)
    }
}

PS:我尝试使用 Time Profiler 分析应用程序,似乎瓶颈是 UIKit 本身的 UITextField 手势处理。

【问题讨论】:

  • 什么叫 setupSubviews?

标签: ios swift sprite-kit uitextfield skscene


【解决方案1】:

您的问题似乎与 SKView 和其他 UIKit 对象之间的不同布局同步有关。 SKView 有一个名为 isAsynchronous (default = true) 的属性,它表示 内容是否异步呈现。 你可以尝试设置:

skView.isAsynchronous = false

将您的SKView 与核心动画更新同步。 这可能还不够,因为您会将SKView 与项目的Core Animations 同步,但总有可能不同步的UIKit 样式动画。 如果此属性不能解决您的问题,您也可以更改 preferredFramesPerSecond 属性。请记住,当您尝试混合使用两个框架(sprite-kit 和 UIKit)时,您将不可避免地遇到不愉快的问题。

【讨论】:

  • 不幸地将isAsynchronous 属性设置为false 并没有改变任何东西。 fps 行为仍然相同。我可能会离开 SpriteKit 路径,转而使用 CAEmitterLayer。无论如何,谢谢。
  • 是的,这是一个不错的决定。 sprite-kit 在您使用 UIKit 时不会提供帮助,尤其是使用 SKEmitterNode
  • 另一个陷阱:如果你想覆盖一个 SKView 以便(UIKit)背景显示出来,你需要将 SKView 的 backgroundColor 设置为 .clear (不是 nil),你还必须启用 'allowsTransparency' .否则 GPU 使用会阻塞。最后,SKScene 的 backgroundColor 还必须为 .clear
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 2020-10-08
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
相关资源
最近更新 更多