ios - 为什么 swift 函数这么贵?

标签 ios swift function sprite-kit

为什么 swift 函数这么贵?

我一直在使用 SpriteKit 编写应用程序。每一帧,我都会在 update() 函数中重新计算 CameraNode 的位置。让我们称之为 //(cameraNodeCode)。当前设置对每秒帧数影响不大,保持在 60。

override func update() {
    //(cameraNodeCode)
}

由于 cameraNodeCode 相当大,我认为最好简化我的代码并将其放入一个函数中:updateCameraNode()。现在这就是我所拥有的:

func updateCameraNode() {
    //(cameraNodeCode)
}

override func update() {
    updateCameraNode()
}

当我这样设置代码时,每秒帧数突然下降到 20。我感到非常惊讶,因为我认为函数的调用成本不会这么高。我决定用这段代码来检验我的理论:

func emptyFunction() {

}

override func update() {
    emptyFunction()
    emptyFunction()
    emptyFunction()
    emptyFunction()
    emptyFunction()
}

正如我预测的那样,当我这样做时,每秒帧数急剧下降,降至每秒 4.1 帧!

我的问题是:

  • 为什么会这样?是不是像我想的那样,因为简单地调用一个函数太昂贵了,还是我遗漏了什么?
  • 有没有一种方法可以让我的代码看起来简单而不用每秒 20 帧?

更新

我遗漏的关键信息是我使用的是 Xcode Playground 。我认为这是 SpriteKit 和 Playground 的错误。我已经向 Apple 提交了一份错误报告,所以我会看看它对我有何帮助。

最佳答案

说到 Sprite-kit,我已经在新的“Hello world”模板中针对我的 iPhone 7 测试了您的代码:

import SpriteKit
class GameScene: SKScene {
    private var label : SKLabelNode?
    override func didMove(to view: SKView) {

        // Get label node from scene and store it for use later
        self.label = self.childNode(withName: "//helloLabel") as? SKLabelNode
        if let label = self.label {
            label.alpha = 0.0
            label.run(SKAction.fadeIn(withDuration: 2.0))
        }
    }
    func emptyFunction() {}
    override func update(_ currentTime: TimeInterval) {
        // Called before each frame is rendered
        //emptyFunction()
        //emptyFunction()
        //emptyFunction()
        //emptyFunction()
        //emptyFunction()
    }
}

如果我不注释更新方法中的行(删除//),则不会发生任何变化。我总是60fps。检查您的项目以找出导致 fps 急剧下降的行,或者如果您在模拟器上测试代码,请尝试在真实设备上测试。希望对您有所帮助。

关于ios - 为什么 swift 函数这么贵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43040859/

相关文章:

ios - 使用隐藏文本字段的空白

ios - 在 NSString 中动态查找单词

ios - Flipboard ipad 应用程序 : right menu panel slide effect

ios - 需要更好更简单地理解 CATransform3D

ios - 如何在 xcode 中为使用 swift 制作的 spritekit 游戏创建主菜单?

ios - Swift 的 MPAndroidChart - 如何删除网格?

swift - 在 Swift 3 中,当结果变得太高时如何计算阶乘?

c - 在 C 中指定函数参数

javascript - 将选择值传递给链接 URL 参数

php函数参数