제목에 대해 죄송합니다. 문제를 설명하는 더 좋은 방법을 생각할 수 없었습니다. 기본적으로 게임에서 충돌 시스템을 구현하려고합니다. 특정 유형으로 형변환 될 수있는 두 객체 (임의의 순서로 주어진)의 충돌을 처리하는 "충돌 처리기"를 등록 할 수 있기를 원합니다. 따라서 Player : Ship : Entity
과 및 (Ship, Particle)
및 (Laser, Entity)
의 핸들러가 (Laser, Player)
의 충돌보다 등록되어 있으면 두 핸들러에 올바른 순서로 인수를 알리고 (Laser, Laser)
의 충돌로 인해 두 번째 처리기에만 알릴 수 있습니다.C#에서 다중 발송 통지 알고리즘 최적화?
는 코드는 그래서 여기에 내가 (naieve 방법) 지금 잘하고있어 무엇을, 천 단어를 말한다 :
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를 잃었다 이), 그래서 나는 몇 사이클/할당을 면도하는 방법을 찾고 있어요.
나는 해시 코드에 기초한 형식으로 유형을 넣은 다음 사전에 넣는 방식으로 생각하고 (그런 다음 구현하는 데 시간을 들여 바보 같은 벽에 내 머리를 찔렀다.), 각 엔트리는 핸들러가 인수의 순서를 바꿔야하는지 여부를 부울 (boolean) 표시와 함께 유형의 쌍에 대한 핸들러의 링크 된 목록입니다. 유감스럽게도 파생 된 유형이 전달 된 경우 구독자에게 기본 유형을 알리지 않으므로 파생 된 유형에 대해서는 작동하지 않습니다. 누구든지 모든 유형 쌍 (두 번)을 확인하는 것보다 더 나은 방법을 생각해 볼 수 있습니까?
감사합니다, 로버트
'당신이 두 핸들러 알림을 원하는 경우 모두 핸들러가 올바른 order'의 인수를 통지해야한다, 당신은 모두 핸들러를 확인해야 그래서 다른 것들을 바꾸지 않고 "두배"의 요구 사항을 제거 할 수는 없습니다. 어쨌든 코드가이 요구 사항을 만족시키는 것 같지 않습니다 ...? – Tanzelax
@Tanzelax - 각 처리기에 대해 OnCollisionsOf 메서드를 한 번 호출하면 실제로 (이 시스템에서) 각 처리기에 알림이 전송됩니다 (두 명의 대리자가 추가되므로). –