抱歉,我想不出更好的方法来描述这个问题。基本上,我正在尝试在游戏中实现碰撞系统。我希望能够注册一个“碰撞处理程序”来处理可以转换为特定类型的两个对象(以任一顺序给出)的任何碰撞。因此,如果Player : Ship : Entity
and Laser : Particle : Entity
,以及处理程序(Ship, Particle)
and (Laser, Entity)
注册比碰撞(Laser, Player)
,两个处理程序都应该收到通知,参数的顺序正确,并且发生冲突(Laser, Laser)
应仅通知第二个处理程序。
一个代码片段说了一千个字,所以这就是我现在正在做的事情(天真的方法):
public IObservable<Collision<T1, T2>> onCollisionsOf<T1, T2>()
where T1 : Entity
where T2 : Entity
{
Type t1 = typeof(T1);
Type t2 = typeof(T2);
Subject<Collision<T1, T2>> obs = new Subject<Collision<T1, T2>>();
_onCollisionInternal += delegate(Entity obj1, Entity obj2)
{
if (t1.IsAssignableFrom(obj1.GetType()) && t2.IsAssignableFrom(obj2.GetType()))
obs.OnNext(new Collision<T1, T2>((T1) obj1, (T2) obj2));
else if (t1.IsAssignableFrom(obj2.GetType()) && t2.IsAssignableFrom(obj1.GetType()))
obs.OnNext(new Collision<T1, T2>((T1) obj2, (T2) obj1));
};
return obs;
}
然而,这种方法相当慢(可测量;实施此方法后我损失了约 2 FPS),所以我正在寻找一种方法来减少几个周期/分配。
我想到了(例如,花了一个小时实现,然后因为自己是个白痴而把头撞到墙上)一种方法,根据哈希码将类型按顺序排列,然后将它们放入字典中,每个条目都是该类型对的处理程序的链接列表,带有布尔值指示处理程序是否希望反转参数的顺序。不幸的是,这不适用于派生类型,因为如果传入派生类型,它不会通知基类型的订阅者。任何人都可以想出一种比检查每个类型对更好的方法(twice)看看是否匹配?
谢谢,
罗伯特