【问题标题】:Odd SpriteKit frame rate drop - lingering SKPhysicsBody instances suspected奇怪的 SpriteKit 帧速率下降 - 怀疑存在 SKPhysicsBody 实例
【发布时间】:2015-10-24 17:20:37
【问题描述】:

我正在开发一个小型 SpriteKit 游戏,该游戏涉及通过生成的一系列级联门来操纵玩家 SKSpriteNode:

Screenshot from an iPhone 5c

为了防止帧速率随时间下降,我在 GameScene 的更新函数中实现了一个简单的代码块:

        for node in children {
        if(node.position.y < -100) {
            if(node.name == "player") {
                switchMode(2)
            }
            node.removeFromParent()
        }

游戏以完美的 60 fps 开始,并在该状态下保持几分钟。

出乎意料的是,游戏在 iPhone 5c 上运行大约 2-3 分钟后出现帧率下降,并且在 4 分钟左右后游戏下降到无法播放的 12 fps。查看我的代码,在更新循环中随着时间的推移并没有发生太多其他事情,所以这种行为很奇怪。有趣的是,当游戏丢失并调用 GUI 游戏时,帧速率会恢复到 60 fps,但会根据游戏运行的时间恢复到较慢的 FPS。

我怀疑屏障的 SKNode 不知何故没有被正确删除,可能是附加到门 SKSpriteNode 实例的 SKPhysicsBody 实例保持活动状态并给 CPU 带来压力。我可以/需要做些什么来显式删除 SKSpriteNode 实例的 .physicsBody 属性以将它们从物理计算中删除?我尝试在删除过程中设置 .physicsBody = nil,但没有帮助。

我在 OS X 10.11.1 上运行 Xcode 7.1,在运行 iOS 9 的 iPhone 5c 上测试我的应用程序。

【问题讨论】:

  • 如果您正在观看 FPS,那么我假设您已将 skView.showsFPS 设置为 YES。您是否也启用了.showsDrawCount 和.showsNodeCount?
  • @Thunk as 在屏幕截图中可见,.showsFPS 和 .showsNodeCount 已启用,但 .showsDrawCount 未启用。此外,SKView 显示的节点数只是屏幕上的节点数。几天前我对 children.count 进行了一些监控,看来 SKNode 已成功删除。
  • 请原谅,children 是什么?你从那个数组中删除你的节点吗?如果该阵列不断建立,则可能会导致速度变慢,因为必须每秒循环通过所有阵列 60 次。性能方面的另一件事是,大约每秒检查一次children(如果需要,可能会更快)。
  • @Gliderman 我的错,我忘了澄清。 children 是 GameScene 下的 SKNode 实例,我已经设法按预期将数组大小保持在较低水平。

标签: ios iphone swift sprite-kit frame-rate


【解决方案1】:

嗯,上次我监控 GameScene 的 children.count 我一定没有监控足够长的时间。与我认为我确认的相反,children.count 缓慢攀升,尽管它并没有在每次更新时都增加。我怀疑有些门没有正确生成,也没有从屏幕上掉下来。我查看了我的源代码,发现这个乱七八糟的:

 func genObstacle(rift: Int, x: CGFloat, width: CGFloat) {
    if(width > 0) {
        let obstacle = SKSpriteNode(color: obstacleColor(rift), size: CGSize(width: frame.width * width / 12, height: frame.width / 12))
        obstacle.position = CGPoint(x: frame.width * (x + width / 2) / 12, y: frame.height * 9 / 8)
        obstacle.position.x += (CGFloat)(rift - activeRift) * 2048
        obstacle.physicsBody = SKPhysicsBody(rectangleOfSize: obstacle.size)
        obstacle.physicsBody?.velocity = CGVector(dx: 0, dy: (CGFloat)(-500 - rift * 300) * (frame.height / 500))
        obstacle.physicsBody?.affectedByGravity = false
        obstacle.physicsBody?.allowsRotation = false
        obstacle.physicsBody?.linearDamping = 0
        obstacle.physicsBody?.mass = 32767
        obstacle.name = "obs"
        addChild(obstacle)
    }
}

随机生成使用随机整数(转换为浮点数)来决定一个门应该有多少“单位”宽度。我不小心留下了宽度为 0 的可能性,这产生了错误的 SKNodes,这些 SKNodes 徘徊并复杂化了物理。对于使用 SpriteKit 出现奇怪帧率下降的其他任何人,密切关注您的 GameScene 的 children.count,这通常可以指示问题的根源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    相关资源
    最近更新 更多