Самое быстрое сравнение типов? - PullRequest
6 голосов
/ 18 декабря 2008

Следующее событие может вызываться сотни раз за кадр.

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 ]

19 голосов
/ 18 декабря 2008
 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();
}
6 голосов
/ 18 декабря 2008

Я бы просто сделал абстрактный метод для объекта Body с именем Collided:

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);
   }
}

Конечно, эмпирическое тестирование должно быть выполнено, чтобы подтвердить, что эта проверка быстрее, чем просто повторный вызов ...

1 голос
/ 18 декабря 2008

Будет ли такой подход осуществимым или полезным?

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();
}
0 голосов
/ 28 июня 2009

Как насчет общего метода столкновения? Тогда нет необходимости в наследовании. Просто интерфейс.

public bool OnCollision<TA,TB>(TA a, TB b)
    where TA : ICollidable
    where TB : ICollidable {
    a.Collision(b);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...