【问题标题】:SpriteKit Battery/Energy DrainSpriteKit 电池/能量消耗
【发布时间】:2017-11-03 19:25:28
【问题描述】:

我已经开发了一段时间的游戏,并且已经意识到我的应用程序会很快耗尽设备电池。我通过 XCode 仪器测量了能量消耗,通常在 17/20 范围内。我有一些背景动画,禁用这些动画似乎有帮助。出于好奇,我用以下简单代码开始了一个项目:

import SpriteKit
import GameplayKit

class GameScene: SKScene {

let NumberOfSprites = 1


override  func didMove(to view: SKView)
{
    view.showsDrawCount = true
    view.showsFPS = true
    view.showsNodeCount = true

    // Set scene to 414x736 with anchorPoint in the bottom left corner
    self.anchorPoint = CGPoint(x: 0, y: 0)
    self.size = CGSize(width: 414, height: 736)

    var spriteArray = [SKSpriteNode]()

    for _ in 0..<NumberOfSprites
    {
        let sprite = SKSpriteNode(color: .black, size: CGSize(width: 50, height: 50))
        sprite.position = CGPoint(x: Int(arc4random_uniform(UInt32(414))), y: Int(arc4random_uniform(UInt32(736))))
        self.addChild(sprite)
        spriteArray.append(sprite)
    }


    let moveAction = SKAction.move(by: CGVector(dx: 50, dy: 50), duration: 1.0)
    let moveAction2 = SKAction.move(by: CGVector(dx: -50, dy: -50), duration: 1.0)

    let repeatAction = SKAction.repeatForever(SKAction.sequence([moveAction, moveAction2]))

    for sprite in spriteArray
    {
        sprite.run(repeatAction)
    }

}


}

此代码将在屏幕上放置一个黑框并无限期地移动它 x+50, y+50, 然后 x-50, y-50。以下是这样做的能源影响。我在设备上测量的能源使用水平平均约为 7-8/20。

我能够添加多达 200,000 个节点(只需更改 NumberOfSprites 变量)并且能量影响增加到 18/20。这对我来说当然是有道理的,虽然我发现有趣的是,我的应用程序在给定时间在屏幕上可能有 120 个节点,只有一个充满动作的句柄,它产生的能量消耗几乎一样多。

我的问题是:如果一个简单的动作会造成如此大的能量影响,那么开发者如何在他们的游戏中处理这个问题?应用商店中有许多复杂的游戏似乎不会很快耗尽电池电量。我错过了什么吗?

提前感谢您的帮助。

【问题讨论】:

  • 你是什么draws countview.showsDrawsCount = true?你用地图集吗?
  • 感谢您的回复。我的游戏的平局数约为 30-40。我尝试过使用地图集,它使我的绘制计数减少了一点,但似乎对能量消耗没有多大帮助。对于我在此处发布的示例,能量使用被认为是“非常高”,没有任何纹理,所以我想知道是否还有其他我遗漏的东西。
  • 根据文档,绘制次数会影响电池消耗。这就是我问的原因。对于 120 个节点,30-40 次抽签在 IMO 中有点高,但让我们把它放在一边……你真的试过看看你的游戏消耗电池的速度有多快吗? (也许然后将结果与其他游戏进行比较)。无论如何,屏幕上有 100 多个节点,同时移动、旋转和缩放,总是对电池产生重大影响。至少 Xcode 每次都是这样。

标签: ios xcode sprite-kit


【解决方案1】:

高 CPU 消耗通常是绘制计数问题。您可以通过使用精灵图集来减少绘制次数,尽管它们有大小限制和其他值得在 Swift 文档中查看的怪癖。特别值得注意的是,当您将许多精灵加载到图集中时,当访问该图集时,它会将所有这些对象放入内存中,因此在您寻求减少 CPU 负载时​​应注意内存使用情况。我还要补充一点,大多数具有大量动画的游戏的能耗都非常高,因此“你能做什么”是有限度的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多