快节奏的SpriteKit游戏具有不规则的CPU活动,并且尽管帧速率保持高水平仍然是紧张/滞后 - 斯威夫特

时间:2017-11-15 04:04:55

标签: swift sprite-kit frame-rate lag skscene

我在一个简单但快节奏的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)上下弹跳。当我运行这个时,我的iPhone 6s的CPU使用率开始在10%左右,然后在30-60秒后增加到25-30%左右(不知道为什么会增加)。在所有这些中,帧速率保持非常接近60 FPS,通常不低于58 FPS(当我运行完整游戏时,它的方式相同)。

几乎在任何时候弹出警报(例如,短信,登录游戏中心等),滞后显示并在我正在运行完整游戏时随机出现。

我还尝试删除并重新运行应用,清理项目,删除派生数据以及在发布模式下运行。这些都不是永久性的。

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

感谢任何帮助。

enter image description here

2 个答案:

答案 0 :(得分:2)

这是Apple优先考虑系统调用的结果。

当系统想要了解某些东西时,检查某些东西或以其他方式做它的事情它是由其他所有东西摆布的。

没有其他引擎可以帮助解决这个问题,没有办法通过代码来消除系统的常量活动。

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

此外,iOS 11中的手机拒绝有一些相当大的变化,这对第一轮iPad Pro模型和创意软件造成了严重破坏,对所有触摸输入产生了多秒拒绝。当这种事情可以通过GM时,你可以非常肯定他们正在通过其他混乱。

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

答案 1 :(得分:0)

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

我通过简单地从VC根视图中删除SKView类名称来解决问题。

enter image description here