Я понимаю, что stackoverflow - это скорее информационный ресурс с вопросом-ответом, но я также считаю, что его основная идея - это, прежде всего, совместное использование решений.И, как я обнаружил хитрую ошибку в библиотеке Apple SpriteKit, и как ее обойти, я поделился с вами решением.
Кроме того, я отправил отчет об ошибке в Apple через https://bugreport.apple.com/,, но 1-триллионной компании, похоже, это не сильно волнует - прошло почти две недели с момента представления отчета, и ошибка все еще открыта,и ни один комментарий / обновление не было дано от команды Apple.
TLDR;
SpriteKit расходует огромное энергопотребление, если ваша игра поддерживает только ландшафтный режим и порядок значений ландшафта UISupportedInterfaceOrientations вВаш файл Info.plist 'неправильный' (!).Если UIInterfaceOrientationLandscapeRight идет первым, а UIInterfaceOrientationLandscapeLeft идет вторым - у вас проблемы.
Обходной путь:
Выберите ваш Info.plist в навигаторе проекта -> Открыть как -> Исходный код.Найдите ключ: UISupportedInterfaceOrientations
Убедитесь, что порядок значений следующий:
(LandscapeLeft идет FIRST)
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
Вот и все.
ОШИБКИ РЕПРОДУКЦИИ ШАГИ
(только для тех, кому любопытно и у них есть немного свободного времени)
Launch XCode,создать совершенно новый проект типа 'Game'
- язык: Swift
- технология игры: SpriteKit
- снять отметку Integrate GamePlayKit
- снять отметку Включить модульТесты
- снимите флажок Включить тесты пользовательского интерфейса
В общих настройках цели
- снимите флажок Ориентация устройства: портрет
- check Требуется полный экран
Удалить файлы: GameScene.sks, Actions.sks (Переместить в корзину)
Заменить содержимое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, изменяя порядок параметров и наблюдая за изменением энергетического воздействия.