我正在制作一款小型SpriteKit游戏,游戏涉及通过生成的级联系列门控机制SKSpriteNode:
为了阻止帧速率随着时间的推移而下降,我实现了一个简单的代码块,该代码块包含在我的GameScene更新功能中:
for node in children {
if(node.position.y < -100) {
if(node.name == "player") {
switchMode(2)
}
node.removeFromParent()
}
游戏以完美的60 fps开始,并在该状态下保持几分钟。
出乎意料的是,在iPhone 5c上游戏运行2-3分钟后出现帧速率下降,4分钟后游戏降至无法播放的12 fps。看看我的代码,在更新循环中随着时间的推移没有发生太多其他事情,所以这种行为很奇怪。有趣的是,当游戏丢失且GUI上的游戏被调用时,帧速率恢复到60 fps,但根据游戏运行的时间长度回落到较慢的FPS。
我怀疑障碍的SKNodes在某种程度上没有被正确删除,也许连接到门SKSpriteNode实例的SKPhysicsBody实例仍处于活动状态并使CPU紧张。我是否可以/需要做些什么来显式删除SKSpriteNode实例的.physicsBody属性以从物理计算中删除它们?我已经尝试在删除期间设置.physicsBody = nil,这没有帮助。
我在OS X 10.11.1上运行Xcode 7.1,在运行iOS 9的iPhone 5c上测试我的应用程序。
答案 0 :(得分:1)
嗯,上次我监视GameScene的children.count我必须没有监视足够长的时间。与我认为的确认相反,children.count慢慢攀升,尽管每次更新都没有增加。我怀疑有些门没有正确生成,并没有通过屏幕掉下来。我查看了我的源代码,发现了这个烂摊子:
func genObstacle(rift: Int, x: CGFloat, width: CGFloat) {
if(width > 0) {
let obstacle = SKSpriteNode(color: obstacleColor(rift), size: CGSize(width: frame.width * width / 12, height: frame.width / 12))
obstacle.position = CGPoint(x: frame.width * (x + width / 2) / 12, y: frame.height * 9 / 8)
obstacle.position.x += (CGFloat)(rift - activeRift) * 2048
obstacle.physicsBody = SKPhysicsBody(rectangleOfSize: obstacle.size)
obstacle.physicsBody?.velocity = CGVector(dx: 0, dy: (CGFloat)(-500 - rift * 300) * (frame.height / 500))
obstacle.physicsBody?.affectedByGravity = false
obstacle.physicsBody?.allowsRotation = false
obstacle.physicsBody?.linearDamping = 0
obstacle.physicsBody?.mass = 32767
obstacle.name = "obs"
addChild(obstacle)
}
}
随机生成使用随机整数(铸造到浮点数)来确定门板应该有多少“单位”宽。我不小心留下了宽度为0的可能性,这造成了错误的SKNodes,它们挥之不去,使物理变得复杂。对于使用SpriteKit,奇怪的帧速率下降的任何其他人,密切注意你的GameScene的children.count ,这通常可以指示你的问题来源。