我根据UIDynamicBehavior
创建了一个应用。这是一个游戏,你在屏幕中间有一个圆圈,从中间向外圆圈发射球(当它们击中它们时它们消失),这个“发射”之间的间隔越来越短(这样做)不会导致问题,你会看到以后)。好吧问题是在大约100个圆圈之后,一切都变得非常迟钝,每次“发射”只是将整个游戏暂时冻结,直到问题变得如此之大,整个事情就会冻结。
问题似乎是我在某种程度上没有正确删除球。即使间隔没有改变并且屏幕上同时出现的球数总是相同(3-4),问题仍然存在。
这也不是内存问题,因为内存使用率保持在20MB左右,但处理器从开始时的0%开始上升,并且一直保持上升和上升直到达到100%并且整个事情就停止了。
所以当我创建一个球时,那里的所有代码都是:
func lunchMyBall(timer: NSTimer!){
let myBall = createBall()
var angle = Int(arc4random_uniform(70))
angle = angle+1-35
if angle < 0 {
angle = -angle
angle = angle-70
} else {
angle = angle+70
}
if arc4random()%2 == 1 {
angle = -angle
}
print("angle: \(angle)")
if lastBallAngle == nil {
myBall.angle = Double(angle)
}else{
switch lastBallColorIndex! {
case 1: switch myBall.colorIndex {
case 1: myBall.angle = lastBallAngle! + Double(angle)
case 2: myBall.angle = lastBallAngle! + Double(angle)-90
case 3: myBall.angle = lastBallAngle! + Double(angle)+180
case 4: myBall.angle = lastBallAngle! + Double(angle)+90
default: break
}
case 2: switch myBall.colorIndex {
case 1: myBall.angle = lastBallAngle! + Double(angle)+90
case 2: myBall.angle = lastBallAngle! + Double(angle)
case 3: myBall.angle = lastBallAngle! + Double(angle)-90
case 4: myBall.angle = lastBallAngle! + Double(angle)+180
default: break
}
case 3: switch myBall.colorIndex {
case 1: myBall.angle = lastBallAngle! + Double(angle)+180
case 2: myBall.angle = lastBallAngle! + Double(angle)+90
case 3: myBall.angle = lastBallAngle! + Double(angle)
case 4: myBall.angle = lastBallAngle! + Double(angle)-90
default: break
}
case 4: switch myBall.colorIndex {
case 1: myBall.angle = lastBallAngle! + Double(angle)-90
case 2: myBall.angle = lastBallAngle! + Double(angle)+180
case 3: myBall.angle = lastBallAngle! + Double(angle)+90
case 4: myBall.angle = lastBallAngle! + Double(angle)
default: break
}
default: break
}
}
if myBall.angle! > 360 {
myBall.angle = myBall.angle! - 360
}else if myBall.angle! < 0 {
myBall.angle = myBall.angle! + 360
}
let tempAngle = CGFloat((myBall.angle!/360)*2*M_PI)
lastBallAngle = myBall.angle
lastBallColorIndex = myBall.colorIndex
dataSource?.lunchMyBall(myBall, angle: tempAngle)
let timer = NSTimer.scheduledTimerWithTimeInterval(Double(difficulty), target: self, selector: "lunchMyBall:", userInfo: nil, repeats: false)
timer.tolerance = 0.01
}
func createBall() -> UIItemView {
var frame = CGRect(origin: CGPointZero, size: CGSize(width: 10, height: 10))
frame.origin = (CGPoint(x: (dataSource?.getCircleCenter().x)!-5, y: (dataSource?.getCircleCenter().y)!-5))
let ballView = UIItemView(frame: frame, color: UIColor.random())
return ballView
}
这就是我将其添加到行为中的方式:
func lunchBall(ball: UIView, angle: CGFloat) {
let myLunchBehavior: UIPushBehavior? = lunchBehavior
let myBall = ball as! UIItemView
myBall.angle = 360-((Double(angle)/(2*M_PI))*360)
myLunchBehavior!.setAngle(angle, magnitude: 0.01)
myLunchBehavior!.addItem(ball)
myBall.pushBehavior = myLunchBehavior
dynamicAnimator?.referenceView?.addSubview(ball)
addChildBehavior(myBall.pushBehavior!)
collisionBehavior.addItem(ball)
}
这就是我删除它的方式:
func collisionBehavior(behavior: UICollisionBehavior, beganContactForItem item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?, atPoint p: CGPoint) {
print("did")
if let myItem = item as? UIItemView {
if (isPointInAngle(myItem.angle!, colorIndex: myItem.colorIndex) == true) {
dataSource?.scoreChanged(true)
print("true")
}else{
dataSource?.scoreChanged(false)
print("false")
}
collisionBehavior.removeItem(myItem)
removeChildBehavior(myItem.pushBehavior!)
myItem.pushBehavior?.removeItem(myItem)
myItem.removeFromSuperview()
}
}
设置为在与其他圆圈发生碰撞时触发。
我很抱歉代码很多,但我真的无法找到问题所在,所以我很难确定它。
我已经在这个问题上工作了2天以上,但仍然无法理解。我尝试了一切,重复使用行为(而不是删除它我创建了一个数组,所以下一个球从那里拿出它并设置一个新的角度),多线程(我真的没有经验),我也查了一下Time Profiler但是因为我是初学者,所以对我来说没有任何意义。我真的很感激有人知道他在做什么,只能盯着它检查并发现任何问题,因为我觉得这个问题对于一个有经验的程序员来说应该是非常明显的。如果有帮助,这是link to my project。所以你可以看到我有两件事我认为很重要。我有一个UIDynamicBehavior
的子类,其中我设置了所有的行为,并且基本的快速类“BallLauncher”应该是导致球发射的原因所以那里也可能存在问题。