【发布时间】:2014-01-17 04:47:42
【问题描述】:
我需要能够在 C# 中使用 Mono 调用基于函数指针的单个方法。委托为此工作得很好,这是他们的目的,但他们似乎每次我设置委托时分配 52 个字节(不是 +=,而是使用 = 设置它,所以委托引用的方法总是一个且只有一个)。
此委托每秒更改多次,它会导致 GC 定期启动,这是我想避免的。
我不介意初始内存分配,但有没有办法在我每次更改单个委托值时阻止分配?
如果没有,除了每次地址更改时不会分配任何内存的委托之外,还有其他动态方式来调用 C# 中的方法吗?
【问题讨论】:
-
代理经常变化的事实似乎表明您的设计可能是错误的树。不是答案,不是我如何阻止我的委托使用这么多内存,而是更多,我如何阻止委托如此频繁地更改?
-
您能否详细说明为什么您一直在更换代表?可能还有其他选择。
-
我确实发现实际问题很有趣。想知道是否有办法阻止代表分配
-
我有一堆用于游戏的状态机。为了使状态机易于管理和升级,它使用单个委托来分支状态,而不是巨大的 switch/case 语句。还允许将状态机分成多个文件以便于维护。世界上数百个参与者以每秒 60 帧的速度运行,并且都使用状态机导致数百个 52 字节的小分配,然后每秒左右 GC 启动并导致打嗝。
-
@ServéLaurijssen blogs.msdn.com/b/shawnhar/archive/2007/07/09/…
It is actually impossible to construct a new delegate without allocating memory
标签: c# delegates mono function-pointers