C#和Unity的事件区别
原本我个人不是很想写一些零零散散的知识点的,但是我发现百度上一些结论是错误的,所以特意写一篇文章来说明。
UnityAction和Action的区别
这里是最让我无语的点,也白白浪费我很多时间,网上有几篇文章说UnityAction效率比Action慢很多,没有用,在我测试下后发现两者性能是一样,经过大量的测试之后肯定了这个结论,我一开始以为是版本更新后问题UnityAction优化了,然后再在Rider里面查看源码:
//Action的源码
namespace System
{
/// <summary>封装一个方法,该方法不具有参数且不返回值。</summary>
/// <footer><a href="https://docs.microsoft.com/en-us/dotnet/api/System.Action?view=netframework-4.7.2">`Action` on docs.microsoft.com</a></footer>
[TypeForwardedFrom("System.Core, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089")]
public delegate void Action();
}
///UnityAction的源码
namespace UnityEngine.Events
{
/// <summary>
/// <para>Zero argument delegate used by UnityEvents.</para>
/// </summary>
/// <footer><a href="https://docs.unity3d.com/2020.3/Documentation/ScriptReference/30_search.html?q=UnityAction">`UnityAction` on docs.unity3d.com</a></footer>
public delegate void UnityAction();
}
这不是一样的吗??都是委托??
两者唯一的不同就是命名空间了,一个是C#自带的,一个是Unity自行封装的。
我又去外网翻了一下,发现有一个奇奇怪怪的讨论区,我合理怀疑有可能是有人直接机翻后得出的结论,具体情况可以查看讨论区,这个问答也是挺离谱的,属于是答非所问了。
UnityEvent和Event的区别
这两者是有蛮多区别的,一位叫JacksonDunstan的博主之前也比对过两者的不同(文章地址),不过时间有点久远,我重新按照他的步骤计算差别(mono编译),下面是结果:
我的数据和他有些不一样,不确定是版本更新的缘故还是由于我查看的Profiler的地方不一样(主要是截图的一些文字对不上看),但是结论是一样的。
之后他还测试了千万次的性能差距,结论是:
在他使用的硬件环境(Unity不是最新版本,2016年的文章),千万次触发下,在最好的情况下UnityEvent触发所有事件的时间是Event的2倍,最差有40倍,这很说明UnityEvent相较于C#Event的效率不高。
除了效率不高之外,还要知道UnityEvent是一个类,引用对象,会产生额外GC垃圾。
那么在这些代价下,使用UnityEvent除了在两个及以上的订阅者会比C#Event消耗的内存少,还有一个序列化的好处,方便编辑器内可视化操作,类似Button的OnClick事件添加。
具体的使用就要看实际的需求了。
一些感想
其实百度查找资料都是这样,有人戏称在CSDN里面找资料就像粪堆里面找吃的(毕竟百度查找编程相关都是CSDN),本身这方面的资料鱼龙混杂,还有很多文章会因为时间或者措辞的问题产生些许偏差,但是我们也没什么办法,作为读者只能够要求自己有一定独立思考、善于辨别以及动手操作的能力,作为博主就要传达的东西尽可能正确。