c# - 从 C# 中的事件注销委托(delegate)时内存分配较高

标签 c# unity3d mono

我们正在开发一个游戏 Unity3D引擎(用户代码使用 Mono - 我们的代码是用 C# 编写的)。

场景是我们有一个公开事件的类,该事件有大约 250 个注册(游戏 map 上的每个关卡对象都将自己注册到该事件):

// Every level registers itself (around 250 levels)
ScoresDataHelper.OnScoresUpdate += HandleOnScoresUpdate;

当销毁这个场景时,每个对象都会从事件中注销自己:

ScoresDataHelper.OnScoresUpdate -= HandleOnScoresUpdate;

当使用内置分析器时,我看到了巨大的内存分配,更深入的挖掘表明这是由于委托(delegate)未注册造成的。

我怀疑这是因为委托(delegate)是不可变的,当将它们链接在一起时,会创建新的实例?

这是 Unity 分析器的屏幕截图:

Profiler

在处理大量事件订阅时,有没有办法避免这些内存分配?

最佳答案

正如您在 comments 中确认的那样想要退订所有的事件订阅,没有理由一一退订。

您可以将事件设置为空。这将在不分配任何内存的情况下取消订阅事件的所有内容。

this.OnScoresUpdate = null;

需要注意的一件事是您不能从 ScoresDataHelper 类之外执行此操作。它必须在 ScoresDataHelper 类中。

关于c# - 从 C# 中的事件注销委托(delegate)时内存分配较高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29587567/

相关文章:

c# - 在 Expression-Bodied 属性中调用新的 RelayCommand (ICommand) 是否安全

c# - Html.Partial 搜索 aspx 而不是 cshtml

mono - 在 Controller 构造函数中访问 GUI 组件时出现 NullReferenceException

C# Mono ssl 问题

apache - 如何在 Debian 10 上安装 mod_mono

c# - C# 中的 PathCanonicalize 等价物

c# - 绑定(bind) boolean 值

c# - 获取屏幕空间中的 UnityEngine.UI.Images 位置并计算归一化偏移量(在覆盖 Canvas 内)

c# - 两个网格单元之间的距离,没有对角线

c# - Unity计算3D鼠标位置