Библиотека SpriteKit. ОШИБКА: разрядка аккумулятора (воздействие энергии высокое / очень высокое) [ВОЗМОЖНОЕ РЕШЕНИЕ] - PullRequest
0 голосов
/ 13 ноября 2018

Я понимаю, что stackoverflow - это скорее информационный ресурс с вопросом-ответом, но я также считаю, что его основная идея - это, прежде всего, совместное использование решений.И, как я обнаружил хитрую ошибку в библиотеке Apple SpriteKit, и как ее обойти, я поделился с вами решением.

Кроме того, я отправил отчет об ошибке в Apple через https://bugreport.apple.com/,, но 1-триллионной компании, похоже, это не сильно волнует - прошло почти две недели с момента представления отчета, и ошибка все еще открыта,и ни один комментарий / обновление не было дано от команды Apple.

TLDR;

SpriteKit расходует огромное энергопотребление, если ваша игра поддерживает только ландшафтный режим и порядок значений ландшафта UISupportedInterfaceOrientations вВаш файл Info.plist 'неправильный' (!).Если UIInterfaceOrientationLandscapeRight идет первым, а UIInterfaceOrientationLandscapeLeft идет вторым - у вас проблемы.

Обходной путь:

  1. Выберите ваш Info.plist в навигаторе проекта -> Открыть как -> Исходный код.Найдите ключ: UISupportedInterfaceOrientations

  2. Убедитесь, что порядок значений следующий:

(LandscapeLeft идет FIRST)

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

Вот и все.

ОШИБКИ РЕПРОДУКЦИИ ШАГИ

(только для тех, кому любопытно и у них есть немного свободного времени)

  1. Launch XCode,создать совершенно новый проект типа 'Game'

    • язык: Swift
    • технология игры: SpriteKit
    • снять отметку Integrate GamePlayKit
    • снять отметку Включить модульТесты
    • снимите флажок Включить тесты пользовательского интерфейса
  2. В общих настройках цели

    • снимите флажок Ориентация устройства: портрет
    • check Требуется полный экран
  3. Удалить файлы: GameScene.sks, Actions.sks (Переместить в корзину)

  4. Заменить содержимое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
    }
}
Замените содержимое 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
        }
    }
}
Подключите доступное физическое устройство, запустите сборку на этом устройстве.Убедитесь, что вы установили целевой объект сборки в соответствии с вашим устройством.

UPD: убедитесь, что iOS устройства ниже -.0.0, в противном случае вы получите высокий энергетический эффект независимо от порядка параметров UISupportedInterfaceOrientations.Похоже, у SpriteKit есть еще одна ошибка энергопотребления, связанная с версией iOS.

Перейдите в Навигатор отладки (Cmd + 7), перейдите в раздел «Воздействие энергии».Среднее воздействие энергии низкое.Хорошо на этом этапе.

Остановите сборку, перейдите к настройкам цели.снимите флажок Ориентация устройства: Пейзаж слева.Ааа и проверь это снова.Да, вы правильно прочитали: сначала снимите флажок, затем проверьте.Теперь вы обречены.

Запустите сборку, перейдите в Debug Navigator (Cmd + 7), переключитесь в раздел Energy Imact.Теперь он мгновенно увеличивается от «Низко» до «Высоко» и заканчивается «Очень высоко».Насколько это круто?

Остановить сборку.Выберите ваш Info.plist в навигаторе проекта -> Открыть как -> Исходный код.Найдите ключ: UISupportedInterfaceOrientations.Вы увидите следующее:

(LandscapeLeft идет ВТОРОМ):

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

изменить его на:

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

(LandscapeLeft идетFIRST)

Запустите сборку, перейдите в Навигатор отладки (Cmd + 7), переключитесь в раздел Energy Impact.Среднее воздействие энергии низкое.Yay.

Вы можете самостоятельно нажимать клавишу UISupportedInterfaceOrientations, изменяя порядок параметров и наблюдая за изменением энергетического воздействия.

...