繁体   English   中英

FPS下降和游戏速度减慢 - Sprite-Kit和Swift

[英]FPS drops and game slows down - Sprite-Kit and 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 + 6打开Xcode Debug Navigator面板。
  3. 选择内存并等待分配的内存是否增长。

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

找到代码中问题的最佳工具是Instruments

我之前已经有了这个,节点数使它看起来已经消失了,但实际上并非如此。

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

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

 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如果在所有可能的。

来自Apple的文档

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

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

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

要将SKShapeNode渲染为纹理, 您可以使用SKView的textureFromNode函数

呈现节点树的内容并将呈现的图像作为SpriteKit纹理返回。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM