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 通常减少了程序的启动时间,这对大型游戏很有用,但是增加了包体的大小,因为增加了编译后的代码

 PlayerSettings.SetScriptingBackend  设置脚本后端

托管代码剥离 

当你构建应用程序时,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 文件中列出的不被裁剪

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TO_ZRG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值