如何以正确的顺序创建多个 SKShapeNode?

How to Create multiple SKShapeNode in a correct order?

创建了多个 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),我觉得是电脑速度的问题:-(。为了安全,现在我设置了'delay += 0.2'。我觉得也是下拉动画的问题。如何确保它们可以按顺序放置?(保持尽可能短的延迟)

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

谢谢。

=== 已编辑 ===

问题2的解答: 圆盘下面有一层地板,它们的恢复必须都设置为0。

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

Developing Metal Apps that Run in Simulator

请注意,此部分:

Simulator doesn't try to exactly simulate the GPU from the iOS or tvOS device you are simulating. For example, if you are simulating the iPhone XS, Simulator does not try to emulate the capabilities of an A12 GPU. Instead, Simulator translates any calls you make and directs them to the selected GPU on the host Mac.

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

skView.showsFPS = true

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

最终,当开发任何基于金属的东西时,SpriteKit 就是其中之一,您无法保证在模拟器上的性能。毕竟是模拟器,不是模拟器

最后引用苹果的话:

Simulator is best used to rapidly prototype and test application behavior, and to develop the basic rendering or compute capabilities of your app.

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