我正在使用Swift& amp; SpriteKit,我注意到FPS从60降到58-59(以及后退)。发生丢弃时会出现明显的延迟 - 看起来像丢弃了1或2帧。
CPU负载大约为20-25%,并且变化不大,内存使用量永久约为8 MB。
屏幕上有6个对象:标签,红色对象(Sprite),2x绿色对象(Sprite),一个框(Sprite)和" ground" (矩形节点)。
除标签外的所有对象都有物理主体(以白色边框显示)。
绿色和白色物体是动态创建的,从右向左移动并在屏幕外时被破坏:
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秒)。
当发生碰撞时,不会发生滞后,只是当红色物体在空中时#34;。并不是每次跳跃都会发生。当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就会下降......
如何调试?
答案 0 :(得分:4)
只有mini上的问题让我觉得你的迷你(或迷你的特定包装)有问题。尝试制作一个新项目,复制文件,然后再次运行。另外,你说9.3,但有9.3.1,9.3.2等。这两个设备可能有不同的构建。
所以,首先,确保您的iphone和iPad运行相同版本的iOS ..也许有一个错误,或者他们修补了一个错误(从而导致一个工作而不是另一个)。
另外,尝试在不同的模拟器上运行它...如果它在模拟器上运行完美,那么我更加怀疑迷你(在它的当前配置中)。
通过这种方式,您还可以看到(可能)问题是否与方向有关(iphone与4:3的宽屏或iPad的任何一种)。
有时,我已经非常奇怪"事情发生在我的项目文件中(即使没有插件),只是创建一个新项目,复制所有文件固定它。如果你点击一个空的" touchesBegan" ...让我觉得Xcode /你的mini有些东西在手边 - 因为它只发生在那个设备上(因此我们知道到目前为止)......
需要考虑的其他事项,
您使用的是哪个版本的Xcode?试试最新的测试版/回到7.3。有什么不同吗?
您是否有另一台可以尝试构建项目的计算机?
如果换出[unowned self]
或将其留在未修复的内容中,那么我的建议是使用print
语句加载您的代码并查看'继续。
如果您使用场景编辑器制作精灵节点,请将它们全部删除并重新制作,或尝试以编程方式制作。这修复了我的一些项目中的随机错误(似乎没有理由)。
我们需要更多代码/信息,但上述内容应该可以解决您的问题。
答案 1 :(得分:2)
嗯,我认为它有点晚了,但是当我向场景添加一些SKShapeNode
时,性能下降了。我没有200 +普通SKSpriteNode
的滞后,当80个节点中只有大约30个SKShapeNode
时,一切都开始冻结。当然没有其他功能,只有路径,笔触/填充颜色和lineWidth