是否可以调用MulticastDelegate
并处理每个连接的处理程序的返回值而不分配任何内存?
背景
在正常情况下,Delegate[]
分配的MulticastDelegate.GetInvocationList()
可以忽略不计。但是在某些情况下,最小化分配很重要。例如,在紧凑框架上运行的Xbox游戏中的游戏过程中,每分配1MB就会触发一个集合和讨厌的帧率问题。
在使用CLR Profiler追捕并消除游戏过程中的大部分分配后,我留下50%的垃圾是由Farseer Physics碰撞回调调用引起的。它需要迭代完整的调用列表,因为用户可以返回false
来取消任何附加处理程序的冲突响应(并且在不使用GetInvocationList()
的情况下调用委托只返回最后附加的处理程序的结果)。
作为参考,here是有问题的Farseer代码:
// Report the collision to both participants. Track which ones returned true so we can
// later call OnSeparation if the contact is disabled for a different reason.
if (FixtureA.OnCollision != null)
foreach (OnCollisionEventHandler handler in FixtureA.OnCollision.GetInvocationList())
enabledA = handler(FixtureA, FixtureB, this) && enabledA;