奇怪的 SpriteKit 帧速率下降 - 怀疑挥之不去的 SKPhysicsBody 实例
Odd SpriteKit frame rate drop - lingering SKPhysicsBody instances suspected
我正在开发一个小型 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每秒帧数。查看我的代码,随着时间的推移,更新循环中不会发生太多其他事情,因此这种行为很奇怪。有趣的是,当游戏失败并调用 GUI 游戏结束时,帧率会恢复到 60 fps,但会根据游戏 运行 的时长回落到较慢的 FPS。
我怀疑障碍的 SKNodes 以某种方式没有被正确删除,也许是连接到门 SKSpriteNode 实例的 SKPhysicsBody 实例保持活动状态并且使 CPU 紧张。有什么我可以/需要做的来显式删除 SKSpriteNode 实例的 .physicsBody 属性 以将它们从物理计算中删除吗?我曾尝试在删除过程中设置 .physicsBody = nil,但没有帮助。
我是 运行 Xcode 7.1 OS X 10.11.1,正在 iPhone 5c 运行 iOS 上测试我的应用程序9.
嗯,我上次监控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)
}
}
随机生成使用随机整数(转换为浮点数)来决定门片的宽度 "units"。我不小心留下了宽度为 0 的可能性,这产生了有问题的 SKNodes,这些 SKNodes 在周围徘徊并使物理复杂化。对于使用 SpriteKit 时出现奇怪的帧率下降的任何其他人,请留意您的 GameScene 的 children.count,通常这可以指示您的问题来源。
我正在开发一个小型 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每秒帧数。查看我的代码,随着时间的推移,更新循环中不会发生太多其他事情,因此这种行为很奇怪。有趣的是,当游戏失败并调用 GUI 游戏结束时,帧率会恢复到 60 fps,但会根据游戏 运行 的时长回落到较慢的 FPS。
我怀疑障碍的 SKNodes 以某种方式没有被正确删除,也许是连接到门 SKSpriteNode 实例的 SKPhysicsBody 实例保持活动状态并且使 CPU 紧张。有什么我可以/需要做的来显式删除 SKSpriteNode 实例的 .physicsBody 属性 以将它们从物理计算中删除吗?我曾尝试在删除过程中设置 .physicsBody = nil,但没有帮助。
我是 运行 Xcode 7.1 OS X 10.11.1,正在 iPhone 5c 运行 iOS 上测试我的应用程序9.
嗯,我上次监控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)
}
}
随机生成使用随机整数(转换为浮点数)来决定门片的宽度 "units"。我不小心留下了宽度为 0 的可能性,这产生了有问题的 SKNodes,这些 SKNodes 在周围徘徊并使物理复杂化。对于使用 SpriteKit 时出现奇怪的帧率下降的任何其他人,请留意您的 GameScene 的 children.count,通常这可以指示您的问题来源。