Ios FPS下降,游戏速度减慢-精灵套件和Swift

Ios FPS下降,游戏速度减慢-精灵套件和Swift,ios,performance,swift,sprite-kit,frame-rate,Ios,Performance,Swift,Sprite Kit,Frame Rate,我有一个使用精灵工具包和Swift的游戏,我在其中生成从屏幕顶部到屏幕底部的随机圆圈 当启动游戏时,它在开始时运行得非常好(大约60 FPS或更少),但随后FPS逐渐下降,游戏变得非常缓慢。。。我不明白为什么FPS会随着时间的推移而下降(节点数量保持在8-10个左右,所以当它们离开屏幕时就会被移除)——我在iOS模拟器和实际设备上都进行了测试,有什么想法吗 我已经检查过了,问题不是来自内存泄漏。此外,我只使用一个视图控制器 我认为唯一可能导致这个问题的功能是这个,但我不知道为什么: /* Fun

我有一个使用精灵工具包和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)
}

可能是内存泄漏

  • 使用Xcode启动游戏
  • 使用CMD+6打开Xcode调试导航器面板
  • 选择内存并等待查看分配的内存是否增长
  • 如果发生这种情况,我的意思是,如果分配的内存继续增长,即使您知道它不应该增长,那么您正在泄漏内存


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

    我以前有过这个,节点计数使它看起来它们消失了,但实际上它们没有

    您需要从视图中删除这些圆,才能真正消除它们

    首先要定义一个集合(在类内部,但不在任何函数内部)

    然后在
    update()
    函数中:

     override func update(currentTime: CFTimeInterval){
          for index in circles {
               if index.position.y <= 0 {
                    index.removeFromParent()
                    circles.remove(index)
               }
          }
     }
    
    覆盖函数更新(currentTime:CFTimeInterval){
    用于圆中的索引{
    
    如果index.position.y
    SKShapeNode
    的性能比
    SKSpriteNode
    差,则应尽可能避免使用
    SKShapeNode

    :

    形状节点对于无法轻松分解的内容非常有用 变成简单的纹理精灵。形状节点对于 在游戏顶部生成和显示调试信息 然而,SKSpriteNode类提供了更高的性能 而不是这个类,所以要节省使用形状节点

    如果您真的想使用
    SKShapeNode
    s(可能是因为它易于原型制作),我建议您执行以下操作:

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

    渲染节点树的内容并将渲染图像返回为 轻快的质感


    您是否可能在游戏中使用多个UIViewController?根据以前的经验,这会导致非常糟糕的性能。节点计数只考虑正在绘制的节点。屏幕外节点不被计数,但可能仍在层次结构中。但因为它们没有被绘制。无论如何,这可能有很多原因,并且需要一些代码,您至少可以暂停ect,或更好:测量结果显示性能较差。一个非常常见的初学者错误是创建太多的节点或实体,可能每次都应该更改,而不是仅仅更改它们的属性。但这是一个简单的操作。开始删除代码,直到发现性能明显更好,然后发布该代码(对性能有影响)这里。@learncos2D谢谢,我发布了一些我认为可能是问题的代码(当我生成下降的圆圈时,它可能会变慢)在何处以及如何删除节点?如果您不知道,这不会自动发生。@LearnCos2D我没有删除从屏幕上掉下来的圆圈的节点,我该怎么做?您认为这是问题所在吗?
     circles.insert(randomCircle)
    
     override func update(currentTime: CFTimeInterval){
          for index in circles {
               if index.position.y <= 0 {
                    index.removeFromParent()
                    circles.remove(index)
               }
          }
     }