最简单的动画会导致较高的cpu使用率和非常高的能量影响SpriteKit

时间:2018-08-07 11:12:26

标签: animation sprite-kit rotation cpu-usage energy

这是最简单的动画:黑洞在屏幕中间旋转。这两行代码将cpu的使用率从3%增加到31%,并将能量影响从低提高到高(有时甚至很高):

    let actionLoop   = SKAction.repeatForever(SKAction.rotate(byAngle: CGFloat(360), duration: 1000))
    hole.run(actionLoop)

这正常吗?我或多或少阅读了类似的讨论,但没有找到明确的答案。这是整个代码和屏幕:

import SpriteKit
import GameplayKit

class GameScene: SKScene {

// Basic for dynamic sizes step01
var width = CGFloat()
var height = CGFloat()

override func didMove(to view: SKView) {

    // Basic for dynamic sizes step02
    width = self.frame.size.width
    height = self.frame.size.height

    // test background color
    self.backgroundColor = .yellow

    // set blackhole
    let hole = SKSpriteNode(imageNamed: "blackhole")
    let startPosition = CGPoint(x: 0, y: 0)
    hole.size = CGSize(width: width/8, height: width/8)
    hole.position = CGPoint(x: startPosition.x, y: startPosition.y)


    let actionLoop   = SKAction.repeatForever(SKAction.rotate(byAngle: CGFloat(360), duration: 1000))
    hole.run(actionLoop)

    self.addChild(hole)



}

}

enter image description here enter image description here

更新:最后但并非最不重要:它不是模拟器。我在真实设备上进行了测试。

1 个答案:

答案 0 :(得分:0)

您的代码有几件事可能会影响效率。

首先,以弧度计算SKAction的旋转角度(对于360度,应为2*PI,大约为6.28,而不是360) 。就目前而言,您的代码会进行大量计算以“过度旋转”精灵,这很浪费。更好的说法是:

SKAction.rotate(byAngle: CGFloat.pi*2, duration: 1000)

第二,在旋转精灵之前,使用相应的功能将其缩放一半,这也有点浪费,因为每次计算旋转时,缩放比例也会重新计算以产生准确的结果。我建议预渲染Sprite的缩小版本,并使用它来节省计算时间和负载。