FPS下降,游戏变慢 - Sprite-Kit和Swift



我有一个使用Sprite-Kit和Swift的游戏,我生成从屏幕顶部到屏幕底部的随机圆圈。

启动游戏时,它在开始时运行良好(大约 60 FPS 或更低),但随后 FPS 逐渐下降,游戏变得非常慢......我不明白为什么 FPS 会随着时间的推移而下降(节点数量保持在 8-10 个左右,所以当它们离开屏幕时它们会被移除) - 我在 iOS 模拟器和实际设备上都对其进行了测试,有什么想法吗?

我已经检查过,问题不是来自内存泄漏。另外,我只使用一个视图控制器。

我认为可能导致此问题的唯一功能是这个,但我不知道为什么:

/* Function to generate single random circle */
func generateCircle() -> Void {
    let circleSize:CGFloat = CGFloat(arc4random_uniform(40) + 3)
    let xPosition:CGFloat = CGFloat(arc4random_uniform(UInt32(size.width)))
    var randomCircle = SKShapeNode(circleOfRadius: circleSize)
    randomCircle.strokeColor = SKColor.redColor()
    randomCircle.fillColor = SKColor.redColor()
    randomCircle.physicsBody = SKPhysicsBody(circleOfRadius: circleSize)
    randomCircle.physicsBody?.dynamic = false
    randomCircle.position = CGPoint(x: xPosition, y: size.height + circleSize*2)
    randomCircle.physicsBody?.dynamic = true
    randomCircle.physicsBody?.categoryBitMask = randomCirclesGroup
    addChild(randomCircle)
}

也许存在内存泄漏。

  1. 使用 Xcode 启动您的游戏。
  2. 打开带有CMD + 6Xcode调试导航器面板。
  3. 选择内存并等待查看分配的内存是否增长。
如果

发生这种情况,我的意思是,如果分配的内存继续增长,即使你知道它不应该增长,那么你正在泄漏内存。

找到代码中问题的确切位置的最佳工具是仪器

我以前遇到过这种情况,节点计数使它看起来它们已经消失了,但它们实际上并没有。

您需要从视图中删除圆圈才能真正摆脱它们。

首先,您将定义一个集合(在您的类中,但不在任何函数中)

 let circles = Set<SKShapeNode>()

然后在generateCircle()函数中,您会说:

 circles.insert(randomCircle)

然后在update()函数中:

 override func update(currentTime: CFTimeInterval){
      for index in circles {
           if index.position.y <= 0 {
                index.removeFromParent()
                circles.remove(index)
           }
      }
 }

基本上,这样做的目的是,在每一帧中,检查是否有任何圆圈低于屏幕底部,如果低于屏幕底部,则删除它们。

SKShapeNode的性能比SKSpriteNode差,如果可能的话,应该尽量避免使用SKShapeNode

来自苹果的文档:

形状节点对于无法轻松分解的内容非常有用 变成简单纹理的精灵。形状节点也非常有用 在游戏之上构建和显示调试信息 内容。但是,SKSpriteNode类提供了更高的性能。 比这个类,所以要谨慎使用形状节点。

如果你真的想使用SKShapeNode s(也许是因为它很容易进行原型设计),我建议你执行以下操作:

    一次性
  • 为形状创建纹理,也许在加载场景时。
  • 缓存渲染的纹理。在您的情况下,具有大小和纹理的字典似乎是合适的,例如 [CGSize: SKTexture] .
  • 从那时起,每当您需要形状时,请从缓存中检索纹理并使用SKSpriteNode显示它们。

要将SKShapeNode渲染成纹理,您可以使用SKView的textureFromNode功能:

呈现节点树的内容,并将呈现的图像返回为 精灵套件纹理。

最新更新