FPS在SpriteKit中下降
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FPS在SpriteKit中下降相关的知识,希望对你有一定的参考价值。
我正在用Swift和SpriteKit开发一个简单的游戏,我注意到FPS从60降到58-59(以及后退)。发生丢弃时会出现明显的延迟 - 看起来像丢弃了1或2帧。
CPU负载大约为20-25%并且变化不大,内存使用量永久约为8 MB。
屏幕上有6个对象:标签,红色对象(Sprite),2x绿色对象(Sprite),一个框(Sprite)和“ground”(Rect形状节点)。
除标签外的所有对象都有物理主体(以白色边框显示)。
动态创建绿色和白色对象,从右向左移动并在屏幕外时销毁:
func scheduleAddingLiquid() {
let wait = SKAction.waitForDuration(NSTimeInterval(getRandomNumber(1, end: 3)))
let block = SKAction.runBlock({
[unowned self] in
let liquidNode = LiquidNode(texture: self.liquidTexture, sceneFrame: self.frame)
self.addChild(liquidNode)
liquidNode.move()
self.scheduleAddingLiquid()
})
let sequence = SKAction.sequence([wait, block])
runAction(sequence)
和:
func move() {
let moveAction = SKAction.moveToX(-frame.width, duration: NSTimeInterval(3))
let removeBlock = SKAction.runBlock({
[unowned self] in
self.removeFromParent()
})
runAction(SKAction.sequence([moveAction, removeBlock]))
}
屏幕触摸时红色物体“跳跃”:
if touches.count > 0 && isHeroOnGround && heroNode != nil {
isHeroOnGround = false
heroNode.physicsBody?.velocity = CGVector(dx: 0, dy: 0)
heroNode.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 400))
}
滞后发生在“跳跃”之后的随机时间间隔内(跳跃后约0.5至1.5秒)。
当发生碰撞时,就会发生滞后,就在红色物体“在空中”时。并不是每次跳跃都会发生。当FPS下降时,CPU负载不会增加。
在ios 9.3,iPad mini 2上测试过。
更新1.在iOS 9.3 iPhone 6上测试 - 前几秒FPS约为50-55,然后它一直是60,没有滞后。因此,它仅落后于iPad mini 2(我只有这两款设备,无法测试其他设备)。
UPD 2.除了红色图外,我已经注释掉了所有对象创建代码。 “跳跃”时它仍然落后。所以,现在我确定它与applyImpulse方法有关。
UPD 3.真的,非常奇怪:我已经从touchesBegan方法中删除了所有代码,但它仍然落后于触摸!该方法完全是空的。我不知道为什么,但如果我点击几次,FPS就会下降......
如何调试?
它只有迷你问题让我觉得你的迷你(或迷你的特定包装)有问题。尝试制作一个新项目,复制文件,然后再次运行。另外,你说9.3,但有9.3.1,9.3.2等。这两个设备可能有不同的版本。
所以,首先,确保您的iphone和iPad运行相同版本的iOS ..也许有一个错误,或者他们修补了一个错误(因此导致一个工作,而不是另一个)。
另外,尝试在不同的仿真器上运行它...如果它在仿真器上运行完美,那么我更加怀疑mini(在它的当前配置中)。
这样,您还可以看到(可能)问题是否与方向有关(iphone与4:3的宽屏或iPad的任何一种)。
有时,我的项目文件(甚至没有插件)发生了“非常奇怪”的事情,只是创建了一个新项目,将所有文件复制到修复它上面。当你点击一个空的“touchesBegan”时它会滞后...让我觉得Xcode /你的mini有些问题就在眼前 - 因为它只发生在那个设备上(因此我们知道到目前为止)......
其他需要考虑的事情,
- 您使用的是哪个版本的Xcode?试试最新的测试版/回到7.3。有什么区别?
- 你有另一台计算机可以尝试从中构建项目吗?
- 如果交换
[unowned self]
或将其保留在其中并没有解决任何问题,那么我的建议是用print
语句加载你的代码,看看发生了什么。 - 如果您使用场景编辑器制作精灵节点,请将它们全部删除并重新制作,或尝试以编程方式制作它们。这修复了我的一些项目中的随机错误(似乎没有理由)。
我们需要更多代码/信息,但上述内容应该可以解决您的问题。
好吧,我想它有点晚了,但是当我在场景中添加一些SKShapeNode
时,我的性能下降了。我没有200+普通SKSpriteNode
的滞后,当有80个节点时,一切都开始冻结,其中只有大约30个SKShapeNode
。当然没有其他功能,只有路径,笔触/填充颜色和lineWidth
以上是关于FPS在SpriteKit中下降的主要内容,如果未能解决你的问题,请参考以下文章
touchesMoved中的SpriteKit + AVAudioPlayer:杀死fps