MulticastDelegate.GetInvocationList()分配。有没有解决的办法?

时间:2014-06-24 12:40:39

标签: c# delegates garbage-collection farseer

是否可以调用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;

0 个答案:

没有答案