7

次のイベントは、フレームごとに何百回も呼び出される可能性があります。

public bool OnCollision(Body body1, Body body2)
{
 if(body2.Tag is Dog)
      ((Dog)body2.Tag).Bark();
}

「is」を使用するとキャストが作成され、それで何かをしたいときにもう一度キャストすることを理解しています。型を確認するより効率的な方法はありますか? 「if(body2.Tag.GetType() == typeOf(Dog))」を試すコンソール アプリを作成しましたが、「is」を使用するよりもさらに遅いようです。

ありがとう。

4

4 に答える 4

19
 if(body2.Tag is Dog)

実際には次のようにコンパイルされます

Dog Temp = body2.Tag as Dog;
if (temp != null)

コードでは、キャストを再度実行しています。より良いでしょう:

Dog dog = body2.Tag as Dog;
if (dog != null)
{
    dog.Bark();
}
于 2008-12-18T17:55:19.907 に答える
6

Collided という Body オブジェクトに抽象メソッドを作成するだけです。

abstract class Body
{
   abstract void Collision(Body other);
}

class Dog : Body
{
   public override void Collision(Body other) {
      this.Bark();
   }

   public void Bark() { ... }
}

次に、衝突関数で、関連するボディで Collision を呼び出すだけです。

public bool OnCollision(Body body1, Body body2)
{
   body2.Collision(body2);
}

このようにして、衝突が発生したときにあらゆるタイプのボディが必要なことを実行できます。これを最適化して、互いに衝突が通知されたボディを追跡し、実行する必要がある関数呼び出しの数を減らすこともできます。

public bool OnCollision(Body body1, Body body2)
{
   // Record that these two objects have been notified of a collision
   // then when these same objects are the only two operands in subsequent calls
   // you can just short circuit the calls.
   if(!AlreadyNotifiedOfCollision(body1, body2))
   {
      body1.Collision(body2);
      body2.Collision(body1);
      NotifiedOfCollision(body1, body2);
   }
}

もちろん、このチェックが実際に呼び出しを 2 回行うよりも高速であることを検証するには、経験的なテストを行う必要があります...

于 2008-12-18T18:12:25.910 に答える
1

このようなアプローチは実現可能または有用でしょうか?

public interface ICollidable
{
    void OnCollision();
}

public abstract class Body : ICollidable
{
    public abstract void OnCollision();
}

public class Dog : Body
{
    public override void OnCollision();
    {
        Bark();
    }
}

public Boolean OnCollision(ICollidable a, ICollidable b)
{
    b.OnCollision();
}
于 2008-12-18T18:12:28.780 に答える
0

一般的な衝突法はどうですか?その後、継承の必要はありません。ただのインターフェース。

public bool OnCollision<TA,TB>(TA a, TB b)
    where TA : ICollidable
    where TB : ICollidable {
    a.Collision(b);
}
于 2009-06-28T18:20:22.100 に答える