をもとにアプリを作りました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 ですが、私は初心者なので、何も意味がありませんでした。経験豊富なプログラマーにとって問題はおそらくかなり明白であるべきだと思うので、彼が何をしているのかを知っている人が問題をチェックして見つけるために目を投げることができることを本当に感謝しています. それが役立つ場合、これが私のプロジェクトへのリンクです。ご覧のとおり、重要だと思われることが 2 つあります。私はサブクラスを持っていますUIDynamicBehavior
ここでは、すべてのビヘイビアーをセットアップし、基本的な Swift クラス「BallLauncher」を持っています。これは、ボールを発射させる原因となるはずなので、そこにも問題がある可能性があります。