我正在使用 XNA 为 xbox360 开发游戏。与 PC 上的垃圾收集器相比,Xbox 上的垃圾收集器性能相当差,因此将产生的垃圾保持在最低限度对于流畅运行游戏至关重要。
我记得有一次读到调用委托(delegate)会产生垃圾,但现在我再也找不到任何关于委托(delegate)产生垃圾的引用资料了。这是我编造的还是委托(delegate)一团糟?
如果委托(delegate)很乱,建议解决方法可加分。
public delegate T GetValue<T>(T value, T[] args);
public static T Transaction<T>(GetValue<T> calculate, ref T value, params T[] args) where T : class
{
T newValue = calculate(value, args);
return foo(newValue);
}
目前我的代码看起来很模糊,我能想到的摆脱委托(delegate)的唯一解决方案是传入一个继承接口(interface) IValueCalculator 的类,然后我可以调用该接口(interface)上的方法,这不是不过真的非常整洁!
最佳答案
在桌面环境中垃圾实际上是免费的。您要担心的是您生产了多少非垃圾。记住垃圾收集器是如何工作的:它首先标记所有已知对象,然后清除所有事件对象上的标记并压缩事件对象。昂贵的步骤是“取消标记事件对象”。销毁垃圾很便宜;它识别昂贵的事件对象,并且该成本取决于您拥有的事件对象的数量(及其引用拓扑的复杂性),而不是您拥有的死对象的数量。
但是,在 XBOX 和其他紧凑型框架上,垃圾收集器运行得非常频繁,并且在创建新分配时运行得更频繁,所以是的,您担心产生垃圾也是正确的。您既希望保持事件集较小(以便使收集便宜)又不进行新分配(因为这会触发收集。)
创建委托(delegate)会分配内存,但调用委托(delegate)只不过是在类上调用名为 Invoke 的方法。委托(delegate)只不过是一个带有名为 Invoke 的方法的类,该方法在被调用时恰好立即调用另一个方法。
无论如何,如果您遇到内存性能问题,那么正确的做法是取出内存分析器并使用它来分析您的程序。随意地想知道这个或那个是否恰好分配内存就像试图用指甲剪在你的花园里除草;这需要很多时间,而且实际上并没有实现你的目标。使用性能分析器分析您的性能并查看问题所在,然后修复它们。
关于c# - 使用委托(delegate)会产生垃圾吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1582754/