您现在的位置是:首页 >技术教程 >unity 中的.net 概述网站首页技术教程
unity 中的.net 概述
unity 中的.net 概述
Unity 使用开源的 .NET platform ,来实现跨平台发布。
Unity 支持两种 .NET profiles: .NET Standard 和 .NET Framework. 它们提供了不同的c#与.NET class libraries交互时使用的 API :
- .NET Standard: .NET Standard 2.1, as published by the .NET Foundation.
- .NET Framework 4.8, as published by Microsoft, .NET Standard 2.1的扩展版
脚本后端
Unity 有两种脚本后端 scripting backends, Mono和IL2CPP (Intermediate Language To C++), 它们使用了不同的编译技术:
- Mono 使用即时 (JIT) 编译,在运行时按需编译代码。好处就是编译的快,也就是打包快,.
- IL2CPP uses ahead-of-time (AOT) compilation ,在打包之前,编译整个程序,AOT 通常减少了程序的启动时间,这对大型游戏很有用,但是增加了包体的大小,因为增加了编译后的代码
托管代码剥离
当你构建应用程序时,Unity会编译并搜索项目中的程序集(. dll),以检测和删除未使用的代码。这个剥离代码的过程减少了构建的最终二进制大小,但增加了构建时间
垃圾收集
Unity在 Mono and IL2CPP backends上使用 Boehm garbage collector . 并且默认使用Incremental 模式(推荐)。
C# 反射开销
Mono 和 IL2CPP 内部都会缓存所有反射的对象,这些对象不会被垃圾收集器收集,结果就是垃圾收集器一直在扫描这些对象,影响了垃圾收集器的性能。
要最大程度减少垃圾回收器开销,在应用程序中避免使用诸如 Assembly.GetTypes 和 Type.GetMethods() 等方法,这些方法会在运行时创建许多 C# 反射对象。
UnityEngine.Object 特殊行为
UnityEngine.Object 是unity中一种特殊的 C# object ,因为它对应了c++中的object,比如, 当你使用Camera 组件, Unity 在c++中的对象里存储该camera 组件的状态,而不是在UnityEngine.Object 上。
Unity现在不支持对object的弱引用。
Unity C# 和 Unity C++ 共享 UnityEngine object
当你调用 Object.Destroy or Object.DestroyImmediate 去destroy 一个 UnityEngine.Object 对象时,销毁的是c++层面的object, 你不能显示的销毁C# object,因为它有垃圾收集器管理,当它不被引用时,垃圾收集器就收回收并销毁它。
当你尝试访问已经被销毁的UnityEngine.Object 时, Unity 对于大多数类型都会重新生成对应的c++层面的对象,除了 MonoBehaviour and ScriptableObject,这俩一经销毁,不会重新生成。
MonoBehaviour 和 ScriptableObject 重载了equality (==) and inequality (!=) 运算符. 如果你把已经销毁的 MonoBehaviour 或者 ScriptableObject 和
null对比
,当托管对象仍然存在且尚未被垃圾收集时,操作符返回true。例外是:??和?.操作符不能被重载,当它们对一个已经销毁的MonoBehaviour或ScriptableObject上使用这些操作符时,当托管对象仍然存在时,它们会返回与==和!=操作符不同的结果。也就是可用
传输层安全性 (TLS) 1.2
The UnityWebRequest API and all .NET Framework Web APIs 除了WebGL平台,其它平台都完全支持 TLS 1.2 . WebGL使用运行应用程序的浏览器和web服务器的安全设置. 特定于平台的本地证书存储将自动验证可用的TLS证书。如果无法访问证书存储,Unity将使用存储的嵌入式根证书。
Unity Linker
unity linker 是untiy的一个工具,它裁剪的是托管代码和一部分引擎代码。
unity linker 它首先会分析你场景中的挂载monobehavior 的物体,把它标记成root,然后静态分析它依赖的代码,分析完成后,那些没有被引用的,就会从程序集中删除。
裁剪过程:
c#代码被编译成CIL,然后被裁剪
裁剪规则:
1.代码被引用的不被裁剪
2.标有不被裁剪属性的不被裁剪,比如
[Preserve]
[RuntimeInitializeOnLoadMethod]
[AlwaysLinkAssembly].3.在link.xml 文件中列出的不被裁剪