在Swift中,使用更新函数的更好替代方法是什么?

3

简而言之:

除了将所有内容放在更新函数中之外,是否有更好的方式可以运行长时间的大型函数并减少内存占用和延迟问题?

完整问题:

我目前正在使用iOS Swift和SpriteKit开发我的第一个游戏应用程序的最后阶段。我遇到了一个比较大的问题,即游戏存在延迟/卡顿现象。 Time Profiler工具指出我的override func update占用了大量的内存和时间。我的更新函数包括以下内容:

override func update(currentTime: CFTimeInterval) {

    if hasStarted {

        // Character
        updateCharacterPosition()
        updateJumpMotion()

        // Blocks
        blockRunnerDebug()

        // Wave
        debugRunningBarPosition()

        // Game Engine
        gameEngine()
        debugGameEngine()
    }

    // Update Scenery
    updateScenery()
}

你可以看到它有很多功能。其中大部分运行背景动画,如水、云或人物跳跃动画。

示例:

// Move y
        self.cloud01.position.y = self.cloud01.position.y + (CGFloat(createSinWave(0.5, b: b, angle: angle))) * 0.3
        self.cloud02.position.y = self.cloud02.position.y + (CGFloat(createSinWave(0.5, b: b, angle: angle))) * 0.3

我的问题是:是否有比将所有内容放在update函数中更好的方法来运行长时间的大型函数,以减少“卡顿”和内存滥用?谢谢。
1个回答

2

基于用户交互可能改变方向或位置的物品需要进行更新。这是无法避免的。

对于像背景动画这样的物品,您可以(并且应该)在开始时设置它们,并将它们放入无限动画循环中,而不是手动更新每个更新的位置。那应该会有很大帮助。


最好的做法是什么?SKAction.runBlock吗? - Nick Groeneveld
1
是的。如果运行块是“最佳选择”,那就取决于你正在做什么,但很可能是这样的。大致如下:runAction(SKAction.repeatActionForever(SKAction.runBlock(doAction))) - Jeremiah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接