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越来越好吧!

目录
相关文章
|
1月前
|
人机交互 开发工具 vr&ar
使用Unity引擎开发Rokid主机应用的模型交互操作
本文介绍如何使用Unity引擎结合Rokid OpenXR Plugin开发空间计算应用,实现射线交互、模型操作等功能。涵盖环境配置、Demo导入、UI搭建与脚本编写,助力开发者快速构建AR交互应用。
|
开发框架 缓存 监控
NET Framework 到 .NET 5/6 的迁移是重大的升级
本文详细介绍了从 .NET Framework 4.8 迁移到 .NET 5/6 的过程,通过具体案例分析了迁移策略与最佳实践,包括技术栈评估、代码迁移、依赖项更新及数据库访问层的调整,强调了分阶段迁移、保持代码可维护性及性能监控的重要性。
172 3
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
959 6
|
开发框架 缓存 前端开发
实战.NET Framework 迁移到 .NET 5/6
从.NET Framework 迁移到.NET 5/6 是一次重要的技术革新,涵盖开发环境与应用架构的全面升级。本文通过具体案例详细解析迁移流程,包括评估现有应用、利用.NET Portability Analyzer 工具识别可移植代码、创建新项目、逐步迁移代码及处理依赖项更新等关键步骤。特别关注命名空间调整、JSON 序列化工具更换及数据库访问层重构等内容,旨在帮助开发者掌握最佳实践,确保迁移过程平稳高效,同时提升应用性能与可维护性。
368 2
|
图形学 机器学习/深度学习 人工智能
颠覆传统游戏开发,解锁未来娱乐新纪元:深度解析如何运用Unity引擎结合机器学习技术,打造具备自我进化能力的智能游戏角色,彻底改变你的游戏体验——从基础设置到高级应用全面指南
【8月更文挑战第31天】本文探讨了如何在Unity中利用机器学习增强游戏智能。作为领先的游戏开发引擎,Unity通过ML-Agents Toolkit等工具支持AI代理的强化学习训练,使游戏角色能自主学习完成任务。文章提供了一个迷宫游戏示例及其C#脚本,展示了环境观察、动作响应及奖励机制的设计,并介绍了如何设置训练流程。此外,还提到了Unity与其他机器学习框架(如TensorFlow和PyTorch)的集成,以实现更复杂的游戏玩法。通过这些技术,游戏的智能化程度得以显著提升,为玩家带来更丰富的体验。
399 1
|
图形学 人工智能 C#
从零起步,到亲手实现:一步步教你用Unity引擎搭建出令人惊叹的3D游戏世界,绝不错过的初学者友好型超详细指南 ——兼探索游戏设计奥秘与实践编程技巧的完美结合之旅
【8月更文挑战第31天】本文介绍如何使用Unity引擎从零开始创建简单的3D游戏世界,涵盖游戏对象创建、物理模拟、用户输入处理及动画效果。Unity是一款强大的跨平台游戏开发工具,支持多种编程语言,具有直观编辑器和丰富文档。文章指导读者创建新项目、添加立方体对象、编写移动脚本,并引入基础动画,帮助初学者快速掌握Unity开发核心概念,迈出游戏制作的第一步。
1090 1
|
开发框架 JSON 监控
实战指南:从 .NET Framework 迁移到 .NET 5/6 的策略与最佳实践
【8月更文挑战第28天】从 .NET Framework 迁移到 .NET 5/6 是一次重要的技术升级,涉及开发环境与应用架构的改进。本文通过具体案例分析,介绍迁移策略与最佳实践,帮助开发者顺利完成转变。
301 1
|
开发者 图形学 API
从零起步,深度揭秘:运用Unity引擎及网络编程技术,一步步搭建属于你的实时多人在线对战游戏平台——详尽指南与实战代码解析,带你轻松掌握网络化游戏开发的核心要领与最佳实践路径
【8月更文挑战第31天】构建实时多人对战平台是技术与创意的结合。本文使用成熟的Unity游戏开发引擎,从零开始指导读者搭建简单的实时对战平台。内容涵盖网络架构设计、Unity网络API应用及客户端与服务器通信。首先,创建新项目并选择适合多人游戏的模板,使用推荐的网络传输层。接着,定义基本玩法,如2D多人射击游戏,创建角色预制件并添加Rigidbody2D组件。然后,引入网络身份组件以同步对象状态。通过示例代码展示玩家控制逻辑,包括移动和发射子弹功能。最后,设置服务器端逻辑,处理客户端连接和断开。本文帮助读者掌握构建Unity多人对战平台的核心知识,为进一步开发打下基础。
652 0
|
数据可视化 vr&ar 开发工具
Unity游戏开发引擎是什么?有哪些优点
Unity引擎是一款由Unity Technologies开发的跨平台游戏开发引擎,广泛用于创建2D和3D游戏以及其他交互式内容,如虚拟现实(VR)和增强现实(AR)应用程序。
614 3
|
JSON 开发框架 API
【推荐100个unity插件之20】一个强大的JSON处理库——Newtonsoft.Json(也称为Json.NET)
【推荐100个unity插件之20】一个强大的JSON处理库——Newtonsoft.Json(也称为Json.NET)
1248 0