2017-01-22 1 views
2

私はLocationNodesとしてサブクラス化された最大20のノードを同時に画面上で回転させるゲームを設計しています。しかし、次の関数を呼び出すと、CPU使用率が100%になりアプリがクラッシュします。これはlocationPositions配列に格納されているノード上でスピンを呼び出しspinLocations()関数で、次のとおりです。サブクラスLocationNodeでノードアクションをサブクラス化する際のCPU使用率を100%にする

func spinLocations() { 
    for (key, val) in locationPositions { 
     let locationNode = fgNode.atPoint(val) as? LocationNode 
     let finalLocation = generateRandomLocation() 
     locationNode?.spin(locationNode!, position: generateRandomLocation(), finalPosition: finalLocation) 
     locationPositions[key] = finalLocation 
    } 
} 

、スピン関数は次のようになります。

func spin(_ locationNode: LocationNode, position: CGPoint, finalPosition: CGPoint) { 
    self.run(SKAction.sequence([SKAction.wait(forDuration: 3.0), SKAction.move(to: position, duration: 3.0), SKAction.move(to: finalPosition, duration: 3.0)])) 
} 

どのようにすることができます私はこれを書き換えるので、クラッシュしませんか?

+2

あなたはどのくらいの頻度ですが電話をかける?追加や追加を続けてメモリを使い果たしてしまうような気がします。 – Knight0fDragon

+0

@amalfilemons 'spin()'メソッドでは 'locationNode'パラメータは必要ありません。あなたはそれを使用しません。この場合の位置ノードは「自己」と同じです。 – Whirlwind

+0

@ Knight0fDragonこれは最も近い答えでした。トレースを実行したところ、テクスチャがメモリを占有しているわけではありませんでしたが、アクション自体がメモリを消費する無限ループを引き起こす別の機能を引き起こしていました。 – illuminatedtype

答えて

1

機能spinは正しいようだが、私は常に自分自身だけならば、それを実行することを好むまだあなたが設けられていないノードのミスアクションの実行または変位としてstrangnessを持つことを避けるように実行されていない:

func spin(_ locationNode: LocationNode, position: CGPoint, finalPosition: CGPoint) { 
     if self.action(forKey: "spin") == nil { 
      self.run(SKAction.sequence([SKAction.wait(forDuration: 3.0), SKAction.move(to: position, duration: 3.0), SKAction.move(to: finalPosition, duration: 3.0)]), withKey:"spin") 
     } 
} 

条件付きキャスト演算子as?は変換を実行しようとしますが、変換できない場合はnilを返します。従って、その結果は任意である。 あなたがやってため-のループで辞書内のキーと値のペアを反復処理することができますが、あなたがatPointで取得ノードタイプの種類を確認する必要があり後:

for (key, val) in locationPositions { 
     let locationNode = self.atPoint(val as! CGPoint) 
     if locationNode is LocationNode { 
      let finalLocation = generateRandomLocation() 
      locationNode.spin(locationNode!, position: generateRandomLocation(), finalPosition: finalLocation) 
      locationPositions[key] = finalLocation 
     } 
} 
関連する問題