2008-12-18 94 views
6

以下事件可能會被調用數百次的幀。最快的類型比較?

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

我明白,使用「is」會導致劇組製作,然後當我想對它做些什麼時,再投它一次。有沒有更有效的方法來檢查類型?我做了一個控制檯應用程序嘗試「if(body2.Tag.GetType()== typeOf(Dog))」,但它似乎比使用「is」更慢。

謝謝。

回答

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

謝謝我沒有意識到這一點!這非常有幫助。 – 2008-12-18 20:34:06

6

我只想做一個抽象的方法稱爲相撞身體對象:

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

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

    public void Bark() { ... } 
} 

然後在你的防撞功能只是呼叫衝突的參與機構。

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

當然實證檢驗都必須做驗證此檢查是不是其實只是在做電話快兩倍......

+0

嗯,那可能是,但人們喜歡upvote和接受答案,提供實際樣本來解決他們的問題,而不僅僅是一個3個字的答案和一個鏈接到維基百科。 – joshperry 2008-12-18 18:16:13

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

通用碰撞方法如何?那麼就沒有必要繼承了。只是一個界面。

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