2

我制作了一个基于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 天了,但仍然无法弄清楚。我尝试了一切,重用行为(我没有删除它,而是创建了一个数组,以便下一个球从那里拿走它并设置一个新角度),多线程(我对此并没有真正的经验),我还研究了时间探查器,但因为我是初学者,所以对我来说没有任何意义。我真的很感谢知道自己在做什么的人能够只盯着它检查并发现任何问题,因为我认为对于有经验的程序员来说问题可能非常明显。如果有帮助,这是我的项目的链接。所以你可以看到我有两件我认为很重要的事情。我有一个子类UIDynamicBehavior我设置了所有行为和一个基本的快速类“BallLauncher”,这应该是导致球发射的原因,因此那里也可能存在问题。

4

0 回答 0