【问题标题】:Fastest Type Comparison?最快的类型比较?
【发布时间】:2008-12-18 17:51:20
【问题描述】:

以下事件可能每帧调用数百次。

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

我知道使用“is”会导致进行强制转换,然后当我想用它做某事时,再进行一次强制转换。有没有更有效的方法来检查类型?我制作了一个控制台应用程序尝试“if(body2.Tag.GetType() == typeOf(Dog))”,但它似乎比使用“is”还要慢。

谢谢。

【问题讨论】:

    标签: c# types xna


    【解决方案1】:
     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();
    }
    

    【讨论】:

    • 谢谢 我没有意识到这一点!这很有帮助。
    【解决方案2】:

    我会在 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);
       }
    }
    

    当然,必须进行经验测试以验证此检查是否比实际调用两次更快...

    【讨论】:

    • 嗯,可能是这样,但人们喜欢投票和接受提供实际样本来解决他们的问题的答案,而不仅仅是 3 个单词的答案和维基百科的链接。
    • 其实这并不完全是双重调度,我的解决方案不会因传递给 Body 的 Collision 方法的类型而异。
    • +1 我更喜欢你的方式。不知道它是否更快,但更优雅。
    【解决方案3】:

    这样的方法是否可行或有用?

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

    【讨论】:

      【解决方案4】:

      通用碰撞方法怎么样?那么就不需要继承了。只是一个界面。

      public bool OnCollision<TA,TB>(TA a, TB b)
          where TA : ICollidable
          where TB : ICollidable {
          a.Collision(b);
      }
      

      【讨论】:

        猜你喜欢
        • 2010-11-29
        • 1970-01-01
        • 2016-10-14
        • 1970-01-01
        • 1970-01-01
        • 2018-01-21
        • 2012-11-16
        • 2016-12-13
        • 2012-09-14
        相关资源
        最近更新 更多