2016-06-27 15 views
3

didBeginContactメソッドで衝突を検出する方法をいくつか試しましたが、どれが効率的であるかはわかりません。フレームレートの低下を減らそうとしています。効率的に衝突を検出する

方法1:

if let thisMine = nodeA as? Mine { 
     if let thisPlayer = nodeB as? Player { 
      thisMine.explode() 
      thisPlayer.takeDamage(thisMine.damage) 
     } 
    } 
    else if let thisMine = nodeB as? Mine { 
     if let thisPlayer = nodeA as? Player { 
      thisMine.explode() 
      thisPlayer.takeDamage(thisMine.damage) 
     } 
    } 

私が相互作用することができます異なるオブジェクトがたくさんあるので、私はこれにdidBeginContact方法で異なるクラスを使用して時間の束をやっています。 (変更とスティーブ・アイヴスによって推奨)

方法2:この方法で

let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask 

    switch contactMask { 

    case CollisionCategoryPlayer | CollisionCategoryMine: 
     let mineNode = contact.bodyA.categoryBitMask == CollisionCategoryMine ? contact.bodyA.node as! Mine : contact.bodyB.node as! Mine 
     let playerNode = contact.bodyA.categoryBitMask == CollisionCategoryPlayer ? contact.bodyA.node as! Player : contact.bodyB.node as! Player 

     mineNode.explode() 
     playerNode.takeDamage(mineNode.damage) 

    default : 
     print("Unregistered contact") 
} 

、Iは、それらの特性及び機能にアクセスするためにプレーヤ/鉱山/他のクラスとして接触体ノードをキャストする必要が。これは、方法1のようにノードのクラスを比較するより効率的ですか? if文の束ではなくswitch文を使う方が効率的だと思いますか?

注:この2つのクラスよりも多い場合は、間違いなく衝突が頻繁に発生する場合は方法2で行くか、する必要があり、これはMost Efficient Way to Check Collisions in didBeginContact

+0

「ベストプラクティス」の質問は、スタックオーバーフローには適していない可能性があります。おそらく、コードレビューの交換を依頼してください。 http://codereview.stackexchange.com/注意:「このコードはベストプラクティスに従っていますか?」ではなく、「ベストプラクティスは何ですか?」と尋ねる必要があります – Knight0fDragon

答えて

1

へのフォローアップの質問です。

この理由は非常に明白です。or-ここでの操作とスイッチのステートメントは、一定の時間内に実行できます。 as?オペレータはO(n)またはO(log2(n))で実行できますが(スウィフトランタイム環境が使用するものに完全に依存しますが、O(1)はほとんどありません)。

パフォーマンスコードとオブジェクトを頻繁に衝突させたい場合は、2つのコードを使用します。しかし、オブジェクトが非常にまれに衝突し、非常にクリアなコードを好む場合は、方法1を選択することもできます。

+0

コード2はコード1と同じタイプのチェックを行いませんスイッチを追加するか、または – Knight0fDragon

+0

応答をありがとう。私がasを使ってキャストしたときにも同じことが成り立ちますか?代わりに?私は授業にキャストする必要があるので!プロパティ/関数にアクセスするには、方法2のパフォーマンスが損なわれますか? – claassenApps

+1

@ Knight0fDragonそうです。しかし、これらのチェック( '!'のためリリースモードで削除される可能性が高い)は、衝突が実際に関心がある場合にのみ実行され、コード1では、2つのオブジェクトが衝突するたびにこれらのチェックが実行されます。 – idmean