FPS在SpriteKit中下降

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FPS在SpriteKit中下降相关的知识,希望对你有一定的参考价值。

我正在用Swift和SpriteKit开发一个简单的游戏,我注意到FPS从60降到58-59(以及后退)。发生丢弃时会出现明显的延迟 - 看起来像丢弃了1或2帧。

CPU负载大约为20-25%并且变化不大,内存使用量永久约为8 MB。

屏幕截图:App Screenshot

屏幕上有6个对象:标签,红色对象(Sprite),2x绿色对象(Sprite),一个框(Sprite)和“ground”(Rect形状节点)。

除标签外的所有对象都有物理主体(以白色边框显示)。

动态创建绿色和白色对象,从右向左移动并在屏幕外时销毁:

func scheduleAddingLiquid() {
let wait = SKAction.waitForDuration(NSTimeInterval(getRandomNumber(1, end: 3)))
        let block = SKAction.runBlock({
            [unowned self] in

            let liquidNode = LiquidNode(texture: self.liquidTexture, sceneFrame: self.frame)
            self.addChild(liquidNode)
            liquidNode.move()

            self.scheduleAddingLiquid()
        })

        let sequence = SKAction.sequence([wait, block])
        runAction(sequence)

和:

func move() {
        let moveAction = SKAction.moveToX(-frame.width, duration: NSTimeInterval(3))
        let removeBlock = SKAction.runBlock({
            [unowned self] in

            self.removeFromParent()
            })

        runAction(SKAction.sequence([moveAction, removeBlock]))
    }

屏幕触摸时红色物体“跳跃”:

if touches.count > 0 && isHeroOnGround && heroNode != nil {
            isHeroOnGround = false
            heroNode.physicsBody?.velocity = CGVector(dx: 0, dy: 0)
            heroNode.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 400))
        }

滞后发生在“跳跃”之后的随机时间间隔内(跳跃后约0.5至1.5秒)。

当发生碰撞时,就会发生滞后,就在红色物体“在空中”时。并不是每次跳跃都会发生。当FPS下降时,CPU负载不会增加。

ios 9.3,iPad mini 2上测试过。

更新1.在iOS 9.3 iPhone 6上测试 - 前几秒FPS约为50-55,然后它一直是60,没有滞后。因此,它仅落后于iPad mini 2(我只有这两款设备,无法测试其他设备)。

UPD 2.除了红色图外,我已经注释掉了所有对象创建代码。 “跳跃”时它仍然落后。所以,现在我确定它与applyImpulse方法有关。

UPD 3.真的,非常奇怪:我已经从touchesBegan方法中删除了所有代码,但它仍然落后于触摸!该方法完全是空的。我不知道为什么,但如果我点击几次,FPS就会下降......

如何调试?

答案

它只有迷你问题让我觉得你的迷你(或迷你的特定包装)有问题。尝试制作一个新项目,复制文件,然后再次运行。另外,你说9.3,但有9.3.1,9.3.2等。这两个设备可能有不同的版本。

所以,首先,确保您的iphone和iPad运行相同版本的iOS ..也许有一个错误,或者他们修补了一个错误(因此导致一个工作,而不是另一个)。

另外,尝试在不同的仿真器上运行它...如果它在仿真器上运行完美,那么我更加怀疑mini(在它的当前配置中)。

这样,您还可以看到(可能)问题是否与方向有关(iphone与4:3的宽屏或iPad的任何一种)。

有时,我的项目文件(甚至没有插件)发生了“非常奇怪”的事情,只是创建了一个新项目,将所有文件复制到修复它上面。当你点击一个空的“touchesBegan”时它会滞后...让我觉得Xcode /你的mini有些问题就在眼前 - 因为它只发生在那个设备上(因此我们知道到目前为止)......

其他需要考虑的事情,

  1. 您使用的是哪个版本的Xcode?试试最新的测试版/回到7.3。有什么区别?
  2. 你有另一台计算机可以尝试从中构建项目吗?
  3. 如果交换[unowned self]或将其保留在其中并没有解决任何问题,那么我的建议是用print语句加载你的代码,看看发生了什么。
  4. 如果您使用场景编辑器制作精灵节点,请将它们全部删除并重新制作,或尝试以编程方式制作它们。这修复了我的一些项目中的随机错误(似乎没有理由)。

我们需要更多代码/信息,但上述内容应该可以解决您的问题。

另一答案

好吧,我想它有点晚了,但是当我在场景中添加一些SKShapeNode时,我的性能下降了。我没有200+普通SKSpriteNode的滞后,当有80个节点时,一切都开始冻结,其中只有大约30个SKShapeNode。当然没有其他功能,只有路径,笔触/填充颜色和lineWidth

以上是关于FPS在SpriteKit中下降的主要内容,如果未能解决你的问题,请参考以下文章

touchesMoved中的SpriteKit + AVAudioPlayer:杀死fps

重复触发 AVAudioPlayer 时,大量 fps 下降(Sprite Kit)

SpriteKit 游戏中的高 CPU 和帧率下降

SKLightNode 性能问题

低 SpriteKit FPS 会导致碰撞丢失?

在 Swift SpriteKit 中禁用节点和 FPS 标签