【问题标题】:How to Create multiple SKShapeNode in a correct order?如何以正确的顺序创建多个 SKShapeNode?
【发布时间】:2019-11-26 15:29:43
【问题描述】:

多个 SKShapeNode 创建如下:

for i in 1...20 {
        let waitAct = SKAction.wait(forDuration: delay)
        self.run(waitAct) {
                let disc = SKShapeNode(rectOf: CGSize(width: width, height: height), cornerRadius: height/2)
                disc.position = CGPoint(x: self.frame.midX, y: self.frame.maxY)
                disc.fillColor = self.discColors[i]
                disc.strokeColor = .clear
                disc.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: width, height: height))
                disc.physicsBody?.affectedByGravity = true
                disc.physicsBody?.density = 0.5 
                disc.physicsBody?.mass = 0.2
                disc.physicsBody?.friction = 1.0
                disc.physicsBody?.restitution = 0
                disc.physicsBody?.isDynamic = true
                disc.physicsBody?.allowsRotation = false
                disc.name = "\(i)"
                self.addChild(disc)

                let label = SKLabelNode(text: "\(i)")
                label.fontColor = .white
                label.fontName = "Arial Rounded MT Bold"
                label.fontSize = fontSize
                label.verticalAlignmentMode = .center
                disc.addChild(label)

                print(i)
        }    
        delay += 0.2
}

所有圆盘在屏幕顶部创建,然后自动下拉,所有圆盘垂直堆叠。

这里有两个问题:

  1. 光盘应按从 1 到 20 的顺序堆叠。打印时,它们是正确的。但是当检查labelNode文本时,它们可以在真实设备上运行,但是对于几张光盘,有时在模拟器上会失败(尤其是在iPad Pro,iPhone 11 Pro等大屏幕设备上开始运行时),我认为这是一个问题计算机速度:-(。为了安全起见,现在我设置了“延迟+= 0.2”。我认为这也是动画问题的下降。我怎样才能确保它们可以按顺序放置?(尽可能保持短暂的延迟)

  2. 当圆盘落下完成并堆叠时,它们会继续非常轻微地持续弹跳。更多的光盘,更多的弹跳。我认为这是disc.physicsBody?.affectedByGravity = true 的问题,但必须启用此功能以便稍后移动。如何让它们保持静止?

谢谢。

=== 已编辑 ===

问题 2 的解决方案: 圆盘下方有一层,它们的恢复必须都设置为 0。

【问题讨论】:

    标签: ios swift skspritenode skscene skshapenode


    【解决方案1】:

    解决SpriteKit 在模拟器上的性能问题,我建议查看此页面:

    Developing Metal Apps that Run in Simulator

    值得注意的是,本节:

    模拟器不会尝试从 iOS 或 tvOS 精确模拟 GPU 您正在模拟的设备。例如,如果您正在模拟 iPhone XS,模拟器不会尝试模拟 A12 显卡。相反,模拟器会翻译您拨打的任何电话并指示 将它们发送到主机 Mac 上的选定 GPU。

    如果您启用以下功能,您可能会看到您的模拟器低于 60.0 fps,具体取决于您的主机性能:

    skView.showsFPS = true
    

    但是,将其设置为 true 并在硬件上使用它应该始终提供 60.0 fps。

    最终,当开发任何基于金属的东西时,例如 SpriteKit,你无法保证模拟器的性能。毕竟是模拟器,不是模拟器

    最后一次引用苹果的话:

    模拟器最适合用于快速原型和测试应用程序 行为,并开发基本的渲染或计算能力 您的应用程序。

    当然,您可以想出一些技巧来解决这些限制,但这样您就不会测试已发布的代码(当针对发布而不是调试进行优化时,这些代码的性能将再次不同)。

    【讨论】:

    • 是的,我的FPS只有10以下,那我就以真机作为参考。能否给出解决问题2的思路?
    猜你喜欢
    • 2018-01-05
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多