我们正在开发一个游戏 Unity3D引擎(用户代码使用 Mono - 我们的代码是用 C# 编写的)。
场景是我们有一个公开事件的类,该事件有大约 250 个注册(游戏 map 上的每个关卡对象都将自己注册到该事件):
// Every level registers itself (around 250 levels)
ScoresDataHelper.OnScoresUpdate += HandleOnScoresUpdate;
当销毁这个场景时,每个对象都会从事件中注销自己:
ScoresDataHelper.OnScoresUpdate -= HandleOnScoresUpdate;
当使用内置分析器时,我看到了巨大的内存分配,更深入的挖掘表明这是由于委托(delegate)未注册造成的。
我怀疑这是因为委托(delegate)是不可变的,当将它们链接在一起时,会创建新的实例?
这是 Unity 分析器的屏幕截图:
在处理大量事件订阅时,有没有办法避免这些内存分配?
最佳答案
正如您在 comments 中确认的那样想要退订所有的事件订阅,没有理由一一退订。
您可以将事件设置为空。这将在不分配任何内存的情况下取消订阅事件的所有内容。
this.OnScoresUpdate = null;
需要注意的一件事是您不能从 ScoresDataHelper
类之外执行此操作。它必须在 ScoresDataHelper
类中。
关于c# - 从 C# 中的事件注销委托(delegate)时内存分配较高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29587567/