快节奏的 SpriteKit 游戏有不规则的 CPU activity 并且 jittery/lags 尽管帧率保持高 - Swift

Fast-paced SpriteKit game has irregular CPU activity and is jittery/lags despite frame rate staying high - Swift

我在一个简单但快节奏的 SpriteKit 游戏中遇到了问题,但我将我的代码缩减为一个弹跳球,但问题的程度仍然较小:

override func didMove(to view: SKView) {
    super.didMove(to: view)

    physicsWorld.contactDelegate = self
    physicsWorld.speed = 1
    physicsWorld.gravity = CGVector(dx: 0.0, dy: 0.0)

    let borderBody = SKPhysicsBody(edgeLoopFrom: self.frame)
    borderBody.friction = 0
    self.physicsBody = borderBody
    borderBody.contactTestBitMask = BallCategory

    addBall()
}

func addBall() {
    let size = CGSize(width: 20, height: 20)
    let position = CGPoint(x: frame.width / 2, y: 50)

    let texture = SKTexture(image: #imageLiteral(resourceName: "whiteCircle"))
    let ball = SKSpriteNode(texture: texture, size: size)
    ball.position = position
    ball.physicsBody = SKPhysicsBody(circleOfRadius: size.width / 2)
    ball.fillColor = .white
    ball.lineWidth = 0
    addStandardProperties(node: ball, name: "ball", z: 5, contactTest: 0, category: BallCategory)
    ball.physicsBody?.isDynamic = true
    addChild(ball)
    launchBall()
}

func addStandardProperties(node: SKNode, name: String, z: CGFloat, contactTest: UInt32, category: UInt32) {

    node.name = name
    node.zPosition = z
    node.physicsBody?.isDynamic = false
    node.physicsBody?.affectedByGravity = false
    node.physicsBody?.mass = 0
    node.physicsBody?.restitution = 1
    node.physicsBody?.friction = 0
    node.physicsBody?.linearDamping = 0
    node.physicsBody?.angularDamping = 0
    node.physicsBody?.angularVelocity = 0
    node.physicsBody?.contactTestBitMask = contactTest
    node.physicsBody?.categoryBitMask = category

}

func launchBall() {
    let ball = childNode(withName: "ball")!
    ball.physicsBody?.velocity = CGVector(dx: 0, dy: 500)
}

此代码导致球 (SKSpriteNode) 上下弹跳。当我 运行 这个时,CPU 使用率在我的 iPhone 6s 开始时约为 10%,然后在可能 30-60 秒后增加到 25-30% 左右(不知道为什么它在增加).在所有这些过程中,帧速率保持非常接近 60 FPS,通常不低于 58 FPS(当我 运行 完整游戏时也是如此)。

几乎每次弹出警报时(例如,短信、登录 Game Center 等),当我 运行 玩完整游戏时,延迟就会出现并随机出现.

我还尝试过删除并重新运行应用程序、清理项目、删除派生数据以及运行发布模式。 None 其中永久有效。

我应该放弃 SpriteKit 并尝试其他框架吗?如果是这样,哪个? Cocos2D?

感谢任何帮助。

这是 Apple 将系统调用的优先级置于几乎所有其他方面的结果。

当系统想要知道某事、检查某事或以其他方式做它的事情时,它会受其他一切的支配。

没有其他引擎能够帮助解决这个问题,没有办法通过代码使系统的持续活动静音。

开启飞行模式,关闭WIFI和蓝牙,可以略有改善。该系统似乎有点意识到它处于更安静的模式并且做的更少,因为它没有 4G 或其他可以与之通信的连接。

此外,iOS11 中的手掌抑制发生了一些相当大的变化,这对第一轮 iPad 专业模型和创意软件造成了严重破坏,造成多秒拒绝所有触摸输入。当这种事情可以通过 GM 时,你可以很确定他们正在通过其他混乱。

这里有一些关于 iOS 11 性能的投诉:https://www.macrumors.com/2017/09/25/ios-11-app-slowdowns-performance-issues/

原来我的视图控制器中有 2 个 SKView。默认情况下,当您将项目作为 SpriteKit 游戏启动时,Xcode 将 GameViewController 的视图控制器 root/superview 设置为 SKView。在某些时候,我添加了第二个 SKView,因为我不打算让场景占据整个屏幕,而且我显然没有意识到 VC 根视图仍然设置为 SKView。所以每次加载 GameViewController 时,它都会加载两个 SKView,这就是我在 Xcode.

中看到 120 FPS 的原因

我通过简单地从 VC 根视图中删除 SKView class 名称解决了这个问题。