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

Posted

技术标签:

【中文标题】最简单的动画会导致高 CPU 使用率和非常高的能量影响 SpriteKit【英文标题】:simplest animation causes high cpu usage and very high energy impact SpriteKit 【发布时间】:2018-08-07 11:12:26 【问题描述】:

这是最简单的动画:一个黑洞在屏幕中间旋转。这两行代码将 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)




更新:最后但同样重要的是:它不是模拟器。我在真机上测试。

【问题讨论】:

这是在模拟器上还是在设备上?模拟器中的 CPU 利用率可以忽略不计,因为它与应用在真实设备上的执行方式没有任何相似之处。 不,它不是模拟器。这是一个真正的设备。我马上更新。 您的 ipad 还有什么问题? ipad 的行为与 iphone 不同,因此您的 ipad 上运行的应用程序可能会导致这些数字跳跃 好的,我现在在我的 iPhone 上测试了它。 CPU 使用率:同一张图片,35% 有动画,3% 没有。有趣的是,这两种情况下的能源影响都是零!谢谢。 再次被 iPad 检查。不,它不依赖于其他应用程序。我只运行了这段代码,结果和以前一样。 【参考方案1】:

您的代码执行的一些操作可能会影响效率。

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

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

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

【讨论】:

以上是关于最简单的动画会导致高 CPU 使用率和非常高的能量影响 SpriteKit的主要内容,如果未能解决你的问题,请参考以下文章

如何停止导致 Firefox 和 Xorg CPU 使用率高的 CSS 动画?

非常高的 CPU 使用率 directx 9

导致 CPU 使用率高的 Cocoa 约束

powershellcpu是不是大于

cpu占用过高的解决方法

ORACLE数据库导致cpu使用率高的原因