2015-01-06 60 views
4

我有一个使用Sprite-Kit和Swift的游戏,其中我从屏幕顶部到屏幕底部生成随机圆圈。FPS下降和游戏变慢 - 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) 
} 
+0

你可能在游戏中使用了多个UIVIewControllers?从以往的经验来看,这会导致糟糕的表现 – Bokoskokos

+0

节点数只考虑正在绘制的节点。离屏节点不计算在内,但可能仍然在层次结构中。但是因为他们没有画出来。无论如何,这可能有很多原因,并且需要一些你至少怀疑或者更好的代码:已经测得性能很差。一个非常常见的初学者的错误是创建太多的节点或实体,可能每次都应该改变某些东西,而不是仅仅改变它们的属性。但是这是一炮打响。开始删除代码,直到您发现性能明显更好,然后在此处发布该代码(其具有性能影响)。 – LearnCocos2D

+0

@ LearnCocos2D谢谢,我发布了一些代码,我认为这可能是问题(当我生成下降的圆时,它可能会减慢) – sachalondon

回答

2

也许有内存泄漏。

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

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

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

1

我以前有过这个,节点数使它看起来已经消失了,但它们确实不是。

你需要从视图中删除圈子以真正摆脱它们。

首先,您需要定义一套(你的类中,而不是任何函数内)

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) 
      } 
     } 
} 

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

0

SKShapeNodeSKSpriteNode相比性能较差,如果可能的话,应尽量避免使用SKShapeNode

From Apple's documentation

形状节点是内容不能被容易地分解成 简单纹理精灵是有用的。形状节点对于 内容构建和显示游戏顶部的调试信息也非常有用。但是,SKSpriteNode类比此类提供更高的性能 ,因此请谨慎使用形状节点。

如果你真的想用SKShapeNode小号(也许是因为它很容易为原型)我劝你做到以下几点:

  • 为你的形状创建纹理单一时间,也许当场景被加载。
  • 缓存渲染的纹理。在你的情况下,具有大小和纹理的字典似乎是合适的,例如[CGSize: SKTexture]
  • 从此,无论何时您需要一个形状,从缓存中检索纹理并使用SKSpriteNode来显示它们。

要渲染的SKShapeNode到纹理you can use SKView's textureFromNode function

渲染的节点树的内容,并返回所呈现的图像作为一个 质地SpriteKit。