Unity 引擎开始从 Mono 迁移到 .NET CoreCLR

简介: Unity 引擎开始从 Mono 迁移到 .NET CoreCLR

b08544ef97c94ea79d58162a8505b1f1.jpg

image.png

现状


d44349a8c94e4e2f81d7a6f7b76db332.png

Unity 引擎开发团队宣布,他们已开始将 Unity 引擎运行时从 Mono 迁移到 .NET CoreCLR。


此外,他们还会提供融合 JIT 和 AOT 的解决方案——即集成 IL2CPP 和 Burst,从而达成编译时间效率和代码生成质量之间的最佳平衡。


目前,Unity 迁移到 .NET CoreCLR 运行时所涉及的工作已经开始。团队表示这是一个非常具有挑战性的旅程,为了能够成功完成迁移,他们会逐步解决这个问题,并确保能够以保持现有 Unity 项目稳定性的方式渐进发布更新。


因此,开发团队会分多个阶段完成此次迁移:

  1. 首先,为桌面平台的独立 player 提供对 .NET CoreCLR 的支持。基于此,开发者可以在 player 设置中选择此运行时以及现有的 Mono 和 IL2CPP 后端。团队认为,此阶段可以帮助他们迁移 Unity 引擎的核心部分(比编辑器部分小得多),并有望解决此迁移所涉及的大部分技术挑战。开发者在这个阶段仍将通过 .NET Standard 2.1 API 访问 .NET 运行时,他们的目标是在 2023 年发布新的运行时。
  2. 然后在第二阶段,团队会把 Unity 编辑器移植到 .NET CoreCLR,同时取消对 .NET Mono 运行时的支持。第二阶段的挑战是,如何在不使用 AppDomain 的情况下在编辑器中重新加载脚本,并完成向 .NET CoreCLR 的切换。它还将涉及升级 IL2CPP 以支持来自 dotnet/runtime 仓库的基类库。开发者最终可以访问完整的 .NET 7.x 或 8.0 API。Unity 团队计划在 2024 年发布新编辑器。

对外,Unity 正在与 Microsoft 和 JetBrains 等行业合作伙伴合作,加大对开源社区的参与力度,以确保 Unity 创作者能使用最新的 .NET 技术。

过去


过去,Unity 选择 Mono


早在2008年,Unity就宣布和Mono合作,但后续Mono新版本使用SGen GC取代Boehm GC时,Unity不想再次付许可证费用。直到当下(2021年7月),Unity依然依赖 Boehm GC。这是一种没有分代的(扫描慢)、Mark-Sweep的(会有内存碎片问题)、保守(不能精确地识别垃圾)的GC。

image.png

对于Boehm GC造成的性能问题,Unity官方有一些折中方案。

  • 先尽量分配好所有对象的内存,然后关闭GC,等到合适的时机(如关卡结束),再开启GC;
  • 默认开启 incremental 模式分帧处理,注意如果在期间有大量引用关系的改写,分帧处理反而会有大量额外性能损耗(主要来自写屏障)

未来


未来,Unity 选择 CoreCLR


自2016年微软将Mono的许可证由GPL改为MIT以来,Unity也加入了 .NET Foundation,开始将最新的Mono集成到自己的引擎中。但随着微软构筑开源的大一统解决方案 .NET 5,Unity似乎改变了原先的想法。从官方论坛中可以总结出他们的规划:

  1. 首先集成最新的Mono,因为其支持 .NET Core 的BCL;
  2. 然后将自家的 IL2CPP 也更新(其依赖Mono的输出结果);
  3. Unity 2021.2开始完全支持.NET Standard 2.1,C#8和部分C#9(Span,Range,default interface methods),其中Span的影响非常深远,目前和BurstCompiler的NativeArray还不能无缝转换,最大难点是Span并没有自己的memory但后者有;
  4. 支持 C#9/10,基于前面的工作,这一步并不难;
  5. 支持 .NET 6(跳过 .NET 5)。
  6. 用CoreCLR替代Mono(GC也相应升级为CoreCLR GC),在此之前,GC并不会升级为        Mono的SGen。这项工作会持续比较久,目前还没有ETA。Unity大部分代码是C++,C#只有薄  薄的一层(但是越来越多的代码在切换到 C#)。在切换到CoreCLR后,其访问Managed Object的方式需要彻底改变,因此改动会很大。总体顺序是:先将Player替换为CoreCLR,然后将Editor也替换掉。

存在的两个难题:

所有dll必须重新编译

要修改 UnityEditor 中大量使用 AppDomain进行hot reload的部分(AppDomain在新版.NET中几乎被废弃,出处));目前的替代类 AssemblyLoadContext 并不能提供之前 AppDomain Reload的所有功能

In general Assembly Load Context is cooperative, and any remaining references (static fields, GC Handles, running threads, etc) will prevent the code from being unloaded.

长远来看,Unity该团队已经意识到自己当年的一些轮子(Coroutine, Customized Boehm GC, IL2CPP, asmdef等)在近几年来.NET运行时、工具链和整套生态的飞速发展面前显得有些陈旧,正在致力于向开发者提供原汁原味的.NET开发体验(出处),同时尽量不颠覆原有的使用习惯(例如出于这些原因,UPM不会和NuGet双向互通)。


另外,Unity团队还有很多高优先级的feature要做,总之,还是希望Unity越来越好吧!

目录
相关文章
|
Ubuntu IDE 前端开发
把.Net开发环境迁移到Linux上去
把.Net开发环境迁移到Linux上去
219 0
|
前端开发 C# 图形学
【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入
前言:在C/S架构上,WPF无疑已经是“桌面一霸”了。在.NET生态环境中,很多小伙伴还在使用Winform开发C/S架构的桌面应用。但是WPF也有很多年的历史了,并且基于MVVM的开发模式,受到了很多开发者的喜爱。
559 0
【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入
|
开发框架 Java .NET
Mono 现状与未来: 从 Xamarin 到 WebAssembly、Blazor 及.NET 5
  本文要点:   Mono 项目始于 2001 年,是首个面向.NET 应用程序的多平台、开源框架的项目。Xamarin 和 Blazor 分别代表了微软在移动和 Web 应用程序方面的努力,它们都是基于 Mono 并由 Mono 提供支持的。.NET 5 为用户提供了两种运行时选项:高性能的 CoreCLR(用于服务器和桌面应用程序)和轻量级的 Mono(用于移动设备和 WebAssembly)。尽管 Mono 已经是.NET 的一部分了,但仍有一些开发工作要致力于改善 Mono 的运行时性能和垃圾回收器。现在.NET Core 可以与 Mono 并行安装了,因此可以一起演进语言和运行时
661 0
mono,让C#脱离.NET环境
mono,让C#脱离.NET环境
341 0
|
SQL 机器学习/深度学习 Cloud Native
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 更新和迁移)--学习笔记
- 状态 - 自动变更检测 - 不查询删除和更新 - 并发
225 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 更新和迁移)--学习笔记
|
移动开发 JSON 缓存
钉钉消息机器人.Net通用C#Unity实现钉钉消息通知一个工具类(无需SDK,无其他引用)
钉钉消息机器人.Net通用C#Unity实现钉钉消息通知一个工具类(无需SDK,无其他引用) Chinar —— 心分享、心创新! 助力快速完成 .Net 通用的钉钉Post机器人消息通知 为初学者节省宝贵的时间,避免采坑! 官方文档详细,但实现方式上没有过多的说明。 本质上就是一个 POST 消息请求 所以我们只要, 完成正常发送POST 使得钉钉方从中可获取对应格式的数据 即可!
1064 0
钉钉消息机器人.Net通用C#Unity实现钉钉消息通知一个工具类(无需SDK,无其他引用)
|
弹性计算 运维 监控
.Net Core 2.1 MVC Web应用迁移到函数计算 custom runtime
前言 Custom Runtime 就是自定义的执行环境, 用户基于 Custom Runtime 可以完成以下目标: 可以随心所欲持定制个性化语言执行环境(例如 golang、lua、ruby)以及各种语言的小版本(例如python3.7、Nodejs12)等,打造属于自己的自定义runtime; 现有的 web 应用或基于传统开发 web 项目基本不用做任何改造,即可将项目一键迁移到函数计算平台。
1455 0
|
Ubuntu Linux 开发工具
把.Net开发环境迁移到Linux上去
.Net Core发布之前,多年来,.Net程序员的开发环境都在Windows上。 三街第一帅的我,虽然上班的8小时一直在windows上撸C#,但是下班时间一般都在搞其他的乱七八糟的东西,比如写写小游戏啊。
2498 0
|
API C# Windows
分析现有 WPF / Windows Forms 程序能否顺利迁移到 .NET Core 3.0(使用 .NET Core 3.0 Desktop API Analyzer )
原文:分析现有 WPF / Windows Forms 程序能否顺利迁移到 .NET Core 3.0(使用 .NET Core 3.0 Desktop API Analyzer ) 版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
1095 0