我正在使用基本物理学的简单SpriteKit游戏(在Swift中),其中涉及拖放一些带触摸的SKSpriteNodes。该实现使用touchesBegan,touchesMoved等,并更新被触摸的精灵的位置。一切都按预期工作,但是:
好:游戏总是以60fps的速度运行,cpu使用率约为50%,gpu为6%
糟糕:拖动的精灵有时非常不稳定(看起来像10fps或类似)。请注意,这意味着即使在此问题期间,所有其他精灵仍然以60fps动画。
这是因为touchesMoved有时会比平常每秒60次更频繁地被调用。通常我可以平滑地拖放一些精灵,然后它开始变得不稳定并且永远不会恢复正常。
这是我的触控处理的简化版本:
override func touchesMoved(touches: NSSet!, withEvent event: UIEvent!) {
if let allTouches = touches.allObjects as? UITouch[] {
for touch in allTouches {
let draggedThing = findDraggedThingForTouch(touch)
draggedThing.dragJoint!.bodyB.node.position = touch.locationInNode(self)
}
}
}
我尝试过使用手势识别器代替触摸事件,更改精灵的位置,而不是通过弹簧关节拖动它,并使拖动的东西不动态。所有版本都出现相同的错误,即一段时间后,touchesMoved或手势识别器动作开始每秒发射5次而不是60次。
是什么导致这种情况?