【发布时间】:2016-12-27 04:18:44
【问题描述】:
我正在使用 Swift 和 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 秒)。
延迟不是在发生碰撞时发生,而是在红色物体“在空中”时发生。而且不是每次跳跃都会发生。 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 就会下降...
如何调试这个?
【问题讨论】:
-
我怀疑你的问题在于你如何混合skactiona和物理引擎。我没有看过你的代码,我注意到你正在应用冲动 + 使用 move to。两个人在一起不好相处。所以检查这两个是否没有干扰......这将是一个开始。
-
更准确地说,如果您已经使用物理引擎移动了这些对象,SKActions 不应该用于移动这些对象。如果您只对联系人感兴趣,那么可以将动作与物理引擎一起使用。
-
你的眼睛不会注意到 1 到 2 FPS 的下降,所以你所说的滞后,可能不是滞后,可能是主线程上的暂停,或者可能是不希望的由于错误的编程影响。有关实际情况的更多信息可能对您的情况有所帮助,或者您可能想将其发送至codereview.stackexchange.com,让人们看到您的代码哪里出了问题。
-
@Whirlwind 我没有对受冲动影响的对象应用任何 SKAction。 SKAction 仅用于非动态对象。
-
你有没有被移除的手势在运行?
标签: ios swift sprite-kit