最简单的动画导致高CPU使用率和非常高的能量影响SpriteKit
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最简单的动画导致高CPU使用率和非常高的能量影响SpriteKit相关的知识,希望对你有一定的参考价值。
这是最简单的动画:黑洞在屏幕中间旋转。这两行代码将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)
}
}
更新:最后但并非最不重要:它不是模拟器。我在真实设备上测试它。
答案
您的代码所做的一些事情可能会影响效率。
首先,SKAction
旋转角度以弧度计算(对于360
度,它应该是2*PI
,大致是6.28
,而不是360
)。就目前而言,您的代码会进行大量计算以“过度旋转”精灵,这很浪费。更好的说法是:
SKAction.rotate(byAngle: CGFloat.pi*2, duration: 1000)
其次,在旋转精灵之前,使用相应的函数将其缩放一半,这也有点浪费,因为每次计算旋转时,缩放也会重新计算以产生准确的结果。我建议预渲染精灵的缩小版本,并使用它来节省计算时间和负载。
以上是关于最简单的动画导致高CPU使用率和非常高的能量影响SpriteKit的主要内容,如果未能解决你的问题,请参考以下文章