我了解stackoverflow确实是一个问答信息资源,但我也相信其核心思想首先是解决方案共享。而且,正如我在Apple的SpriteKit库中发现一个棘手的错误以及该错误的解决方法一样,我与您分享了解决方案。
我还通过https://bugreport.apple.com/向Apple提交了错误报告,但是这家规模达1万亿美元的公司似乎并不在意-报告发布已经快两周了,而且该错误仍处于打开状态,苹果工作人员对此发表了评论/更新。
如果您的游戏仅支持横向模式,并且Info.plist文件中UISupportedInterfaceOrientations横向值的顺序为“错误”(!),则SpriteKit会消耗大量能量。如果UIInterfaceOrientationLandscapeRight排在第一位,而UIInterfaceOrientationLandscapeLeft排在第二位,则您有麻烦。
解决方法是:
在项目导航器中->打开方式->源代码中选择Info.plist。查找密钥:UISupportedInterfaceOrientations
确保值的顺序如下:
(LandscapeLeft排名第一)
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
就是这样。
(仅适用于那些好奇并有一些额外空闲时间的人)
启动XCode,创建一个类型为“游戏”的全新项目
在目标常规设置中
删除文件:GameScene.sks,Actions.sks(移至垃圾箱)
用以下
代码:
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
}
}
代码:
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低于-12.0,否则,无论UISupportedInterfaceOrientations参数的顺序如何,都将对能量产生高影响。看起来SpriteKit甚至还有另一个与iOS版本有关的能耗错误。
转到Debug Navigator(Cmd + 7),切换到Energy Impact部分。平均能量影响低。在这一点上很好。
停止构建,转到目标设置。取消选中设备方向:横向向左。再次检查。是的,您没看错:先取消选中,然后再选中。现在,你注定要失败。
运行构建,转到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排名第一)
您可以自己播放UISupportedInterfaceOrientations键,更改参数的顺序,并观察相应的能量影响。