swift - 快节奏的 SpriteKit 游戏具有不规则的 CPU 事件,并且尽管帧速率保持在高水平,但仍会出现抖动/滞后 - Swift

标签 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(当我运行完整游戏时也是如此)。

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

我还尝试删除并重新运行应用程序、清理项目、删除派生数据并在 Release模式下运行。这些都不是永久有效的。

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

感谢任何帮助。

enter image description here

最佳答案

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

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

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

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

此外,iOS 11 中的防手掌误触功能发生了一些相当大的变化,这对第一轮 iPad Pro 型号和创意软件造成了严重破坏,造成了对所有触摸输入的多秒拒绝。当这种事情可以通过 GM 处理时,您可以非常确定他们正在避开其他困惑情况。

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

关于swift - 快节奏的 SpriteKit 游戏具有不规则的 CPU 事件,并且尽管帧速率保持在高水平,但仍会出现抖动/滞后 - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47299191/

相关文章:

ios - 自定义 UIButton 不显示

iphone - Sprite Kit 游戏仅限于较新的手机吗?

python - 使用 ffmpeg-python 设置转换后的输出文件的帧率

ios - NavigationBar 后退按钮不起作用

string - Swift 2.2 循环遍历字符串并获取字符和索引

xcode - 如何快速退出自定义第一响应者

ios - 如何制作像gomoji应用程序一样的2D模型(可移动)?

swift - 当 isDynamic 为 false 时,SpriteKit Sprite 会轻微移动

memory-management - 在 Swift 程序中有必要使用 autoreleasepool 吗?

iOS OpenGL ES - 仅根据请求绘制