SpriteKit库错误:电池电量耗尽(能量影响很高/非常高)[WORKAROUND]

时间:2018-11-13 12:26:42

标签: ios sprite-kit

我了解stackoverflow确实是一个问答信息资源,但我也相信其核心思想首先是解决方案共享。而且,正如我在Apple的SpriteKit库中发现一个棘手的错误以及该错误的解决方法一样,我与您分享了解决方案。

我还通过https://bugreport.apple.com/向Apple提交了错误报告,但是这家规模达1万亿美元的公司似乎并不在意-报告发布已经快两周了,而且该错误仍处于打开状态,苹果工作人员对此发表了评论/更新。

TLDR;

如果您的游戏仅支持横向模式,并且Info.plist文件中UISupportedInterfaceOrientations横向值的顺序为“错误”(!),则SpriteKit会消耗大量能量。如果UIInterfaceOrientationLandscapeRight排在第一位,而UIInterfaceOrientationLandscapeLeft排在第二位,则您有麻烦。

解决方法是:

  1. 在项目导航器中->打开方式->源代码中选择Info.plist。查找密钥:UISupportedInterfaceOrientations

  2. 确保值的顺序如下:

(LandscapeLeft排名第一)

<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>

就是这样。

错误重现步骤

(仅适用于那些好奇并有一些额外空闲时间的人)

  1. 启动XCode,创建一个类型为“游戏”的全新项目

    • 语言:Swift
    • 游戏技术:SpriteKit
    • 取消选中集成GamePlayKit
    • 取消选中包括单元测试
    • 取消选中“包括UI测试”
  2. 在目标常规设置中

    • 取消选中设备方向:纵向
    • 选中需要全屏显示
  3. 删除文件:GameScene.sks,Actions.sks(移至垃圾箱)

  4. 用以下

  5. 替换GameScene.swift的内容

代码:

import SpriteKit

class GameScene: SKScene {

    fileprivate let nodeSizeUnit: CGFloat = 50

    override func didMove(to view: SKView) {
        let layer = getLayer()
        let nodeWithBody = getItemWithBody()

        layer.addChild(nodeWithBody)
        addChild(layer)     
    }

    fileprivate func getLayer() -> SKNode {
        let layerSize = CGSize(width: nodeSizeUnit * 3, height: nodeSizeUnit * 3)
        let layer = SKSpriteNode(texture: nil, color: UIColor.blue, size: layerSize)
        layer.position = CGPoint(x: size.width / 2, y: size.height / 2)

        return layer
    }

    fileprivate func getItemWithBody() -> SKNode {
        let bodySize = CGSize(width: nodeSizeUnit, height: nodeSizeUnit)
        let body = SKPhysicsBody(rectangleOf: bodySize)

        body.isDynamic = false
        body.affectedByGravity = false
        body.categoryBitMask = 0
        body.collisionBitMask = 0
        body.contactTestBitMask = 0

        let item = SKSpriteNode(texture: nil,
                                color: SKColor.gray,
                                size: CGSize(width: nodeSizeUnit * 2, height: nodeSizeUnit * 2))
        item.physicsBody = body

        return item
    }
}
  1. 用以下内容替换GameViewController的内容

代码:

import SpriteKit

class GameViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        if let view = self.view as! SKView? {
            let scene = GameScene()
            scene.size = UIScreen.main.nativeBounds.size
            scene.scaleMode = .aspectFill
            view.presentScene(scene)

            view.ignoresSiblingOrder = true

            view.showsPhysics = true
            view.showsFPS = true
            view.showsNodeCount = true
            view.showsDrawCount = true
        }
    }
}
  1. 连接可用的物理设备,然后在该设备上运行构建。确保根据您的设备设置构建的“部署目标”。

UPD:确保设备iOS低于-12.0,否则,无论UISupportedInterfaceOrientations参数的顺序如何,都将对能量产生高影响。看起来SpriteKit甚至还有另一个与iOS版本有关的能耗错误。

  1. 转到Debug Navigator(Cmd + 7),切换到Energy Impact部分。平均能量影响低。在这一点上很好。

  2. 停止构建,转到目标设置。取消选中设备方向:横向向左。再次检查。是的,您没看错:先取消选中,然后再选中。现在,你注定要失败。

  3. 运行构建,转到Debug Navigator(Cmd + 7),切换到Energy Imact部分。现在,它眨眼间就从“低”变到“高”,最终变成“非常高”。那有多酷?

  4. 停止构建。在项目导航器->打开方式->源代码中选择Info.plist。查找键:UISupportedInterfaceOrientations。您会看到以下内容:

(LandscapeLeft排名第二):

<array>
    <string>UIInterfaceOrientationLandscapeRight</string>
    <string>UIInterfaceOrientationLandscapeLeft</string>    
</array>

将其更改为:

<array>
    <string>UIInterfaceOrientationLandscapeLeft</string>    
    <string>UIInterfaceOrientationLandscapeRight</string>
</array>

(LandscapeLeft排名第一)

  1. 运行构建,转到Debug Navigator(Cmd + 7),切换到Energy Impact部分。平均能量影响低。是的。

您可以自己播放UISupportedInterfaceOrientations键,更改参数的顺序,并观察相应的能量影响。

0 个答案:

没有答案