乘风破浪,遇见最佳跨平台跨终端框架.Net Core/.Net生态 - .NET和Unity的未来(来自Unity官方告白)

news/2024/5/9 15:08:17/文章来源:https://www.cnblogs.com/taylorshi/p/16614677.html

image

我们最近发起了一次持续数年的改进行动,帮助用户更快地编写性能更高的代码,并带来长期的稳定性与兼容性。请在本文中了解我们在更新脚本基础技术栈方面所做的努力。

.NET生态正在多方面上积极动态地演变,而我们希望尽快将这些改进带给广大用户。我们内部的.NET技术小组正致力于不断改进.NET集成,更新最新的C#特性与.NET Standard 2.1。但根据大家的反馈,我们最近又在全面改善开发者体验上投入了更多力量。

本文将介绍我们正在努力解决的几个问题。相关话题已在GDC 2022的Unity Dev Summit上被讨论过。你可以在这里回顾完整演讲。

.NET和Unity的演变

Unity与.NET的故事要从17年前说起,当时我们的CTO决定开始采用Mono .NET运行时和C#。Unity之所以偏爱C#,不仅是因为它很简单,还因为JIT(just-in-time)编译器可以将C#代码转译成效率较高的原生代码。而为了做到性能平衡、可控,Unity引擎剩下的大部分都采用了C++开发

IL2CPP(Intermediate Language To C++) 是一种由Unity开发的脚本后端,可在为各种平台构建项目时替代Mono。使用IL2CPP构建项目时,Unity会在为所选平台创建本机二进制文件(例如.exe、apk、.xap)之前将脚本和程序集内的IL代码转换为C++。IL2CPP的一些用途包括提高Unity项目的性能、安全性和平台兼容性。

多年来,Unity一直依靠着Mono .NET运行时和C#语言(2.0)的一个特定分支来运行。在这期间,引擎对其他平台的支持也在不断扩增。我们还开发了自己的编译器和运行时:IL2CPP让你能够针对iOS及部分主机平台进行开发

与此同时,整个微软.NET生态系统也在不断发展,并推出了新的许可和对非Windows平台的支持。我们借着这股东风在2018年升级到了Unity .NET Mono Runtime,并引入了更现代的C#版本(7.0以上)。同年,我们还发布了Burst编译器的首个版本,开创了为C#分支快速生成原生代码的先河。在取得这一突破后,Unity提出了一个新设想:将C#拓展到引擎剩余几个关键部分、不再用C++进行开发,并为DOTS运行时的开发做铺垫

Unity 2020 LTS和Unity 2021 LTS带来了新版C#语言和.NET API(如Span)。同时,我们也看到.NET生态的性能有了极大的改善,其引入的csproj SDK风格和蓬勃发展的NuGet生态正在让开发环境变得更加友好

我们将要做的事

经过长时间的发展,Unity已经包含了一个巨大的C++代码库,它继承了Mono .NET Runtime的职能来直接与.NET对象互动。这些代码对.NET (Core) Runtime来说不再合规或高效。

此外,Unity编辑器还绑定着一条复杂的自定义编译管线,它不依靠MSBuild运行,因此也不能轻易从引擎特性中获益。

在过去几年里,我们也一直在积极与广大用户交流,包括个人采访和Unity论坛,以发掘出真正能促使用户成功的改进。我们听到大家非常想使用最新的C#语言、.NET运行时技术和NuGet的第三方C#代码。在谈到Unity平台的使用时,大家都说希望借助高质量的C#测试、调试和剖析工具,标准.NET API和Unity API的优秀整合,来最大限度地挖掘出硬件的性能。 作为一名Unity C#程序员,你希望Unity工具能够与工具箱中的其他工具无缝衔接,能实现快速迭代,从而实现一流的运行时性能。

要达到这个目标,我们得花几年时间。我们将频繁更新博客和论坛,让大家了解我们在前进道路上遇到的技术挑战。

我们的做法

这项计划的第一步是在Unity内部集结所有热衷于C#和.NET的内部员工,建立一支C#/.NET技术小组来开展工作

我们的工作将建立在.NET生态系统之上,而非开发定制解决方案。为了让用户能享受新版.NET SDK/Runtime和MSBuild所带来的性能与生产力提高,我们将从Mono .NET Runtime转移到CoreCLR,即现代的.NET (Core) Runtime

这项行动也会带来当前.NET领域以外的创新,让C#脚本能更快地完成.NET迭代。我们将致力于结合IL2CPP和Burst这两个JIT和AOT (ahead-of-time) 解决方案,在编译效率和CodeGen(代码生成)质量之间的达到最佳平衡。

在外部,我们将与微软、JetBrains等业内伙伴合作,保证Unity创作者能用上最新的.NET技术。我们也在进一步深入参与开源社区。 这项工作将分成几个步骤进行。再来看看我们未来的计划。

2022年的工作内容

今年,我们的团队计划在以下几个方面开展工作。

image

C#开发流程

迭代时间仍然是我们首要的工作重点,我们清楚每一名用户都想尽可能地利用起自己的时间。以下是我们改进工作的几个例子。

  • 我们正在改进编译管线的IL Post Processing所耗费的时间,它负责在C#被编译后修改编译好的.NET程序集。现在IL Post Processing将在编译阶段后持续运行,来降低约几百毫秒的耗时。

  • 随着Burst编译器的使用愈加频繁,我们将采用一种可传递哈希算法来改进代码改动检测的精细度。如此一来,我们就能够找出那些需要快速编译的可爆发(Burstable)代码。我们正在将Burst编译器移出进程,使其能在单独的.NET 6.0可执行程序中运行,更快地完成代码编译

  • 我们还将改进引擎每次调用TypeCache、在后台建立镜像数据(reflection data)的过程,此改进域的重新加载

  • 我们还将添加测试和验证流程来更好地跟踪软件包和项目模板的迭代时间倒退。

至于转移到MSBuild,我们第一步须将编译管线与Unity编辑器分割开来,并将其转移到一个单独的进程中。这个过程涉及多年以来遗留下来的成千上万行C++和C#代码,我们要实现这一目标就必须解开这些代码——同时还要保持向下兼容。这项工作并不会在用户的角度带来多大变化,但它将铺好通往MSBuild的道路并简化引擎的维护

我们还将改进Burst的C# IDE调试体验,推出一种新的调试模式,当用户在Burst代码路径上设置断点时,自动将调试器切换到托管调试。这意味着你不必再手动删去调试路径上的[BurstCompile]属性。

现代化.NET运行时

转移至.NET CoreCLR运行时的工作已经开始,这是一个非常具有挑战性的旅程。为了使整个过程能够顺利完成,我们将分步骤解决各个问题,并在保证现有Unity项目稳定的前提下碎片化发布更新。

因此,整个迁移过程将分多个阶段完成:

  • 首先,我们将为桌面平台上的独立运行版提供.NET CoreCLR的支持。该运行时将和现有的Mono与IL2CPP后端一起在运行版设置中列出。 第一阶段我们将完成Unity引擎核心部分(比编辑器部分小得多)的迁移,并尽量解决迁移过程所涉及的绝大部分技术挑战。我们的目标是在2023年期间发布这个新运行时,目前你仍需用.NET Standard 2.1 API访问.NET运行时。

  • 然后,我们会把Unity编辑器移植到.NET CoreCLR,同时移除对.NET Mono运行时的支持。第二阶段我们将挑战不使用AppDomains在编辑器内重新加载脚本,并完成向.NET CoreCLR转移。这一阶段也将涉及到升级IL2CPP、支持dotnet/runtime仓库的基础类库。你将能使用完整的.NET 7.x或8.0 API。我们希望能在2024年里发布这个新的编辑器。

现代化Unity运行时

Unity 2021 LTS新支持的.NET Standard 2.1使我们能够从多个方面着手现代化Unity运行时。我们目前正在推进两项改进工作。

改进async/await编程模型。基础性的async/await编程方法主要用于编写必须异步完成、不阻塞引擎主循环的游戏代码

2011年,在async/await成为.NET的主流之前,Unity引入了基于迭代器的异步运算协程(coroutines),但这种方法并不兼容async/await,并且效率也更低。同时,.NET Standard 2.1一直在改进C#和.NET对async/await的支持,推出了ValueTask来更高效地完成async/await的运算,并允许用户自行用AsyncMethodBuilder编写的类任务系统。

在有了这些改进之后,我们将努力结合async/await与Unity中现有的异步操作(如等待下一帧或等待UnityWebRequest的完成)。第一步,我们将引入取消令牌(cancellation token),改进MonoBehavior被销毁时或退出运行模式时被挂起异步任务的取消操作。我们也一直在与UniTask作者等社区贡献者密切合作,保证他们能够用上这些新功能。

利用Span减少内存分配和拷贝。Unity本身是一个带有C#编程外壳的C++引擎,两种语言之间存在着大量的数据交换。这就造成引擎经常性地来回复制数据、分配托管对象,造成工作效率低下。

C# 7.2引入的Span可以有效改善这个问题,且.NET Standard 2.1默认可使用Span值类型。近年来,你可能听说过或读到过许多归功于Span的.NET运行时重大性能改进(改进细节可在.NET Core 2.1、.NET Core 3.0、.NET 6、.NET 6等博文中了解)。我们同样希望在Unity中利用起它,并有效地减少分配,从而减少Garbage Collection卡顿、提高大量API的整体性能

加入我们的旅程

相信大家和我们一样对这些变化和功能感到非常兴奋。

https://unity.com/roadmap/unity-platform/engineering

欢迎大家来论坛留下自己的想法。我们将定期更新Unity路线图的引擎工程部分,你可以在那里与我们分享你的功能需求和优先事项建议。

参考

  • .NET和Unity的未来
  • Unity and .NET, what’s next?
  • IL2CPP - Unity 手册
  • Overview of .NET in Unity
  • DOTS Development Status And Next Milestones - March 2022
  • Experimental Scripting Previews
  • Engineering tools roadmap
  • Unity将是驱动C#增长的引擎吗?
  • 在C#中使用Span<T>Memory<T>编写高性能代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_2529.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【pytest】工厂化的fixtures

前言:在一个测试用例中需要多次调用同一个fixture的时候,工厂化的 fixture 的模式对于一个 fixture 在单一的测试中需要被多次调用非常有用。 之前写fixture是直接return一个数据,在测试用例中可以直接使用,现在我们需要返回一个生成数据的函数,这样就能在用例中多次调用了…

【Coel.学习笔记】后缀自动机

接下来就是咕咕咕时间了~来了!NOI 算法中最抽象的字符串算法——后缀自动机! 当然咱只是一个普通的小 OIer,不会搞那么多杂七杂八的ww 引入 后缀自动机(\(\text{Suffix Automaton}\),简称 \(\text{SAM}\))是一种确定性有限状态自动机(\(\text{Determined Finite Automat…

Python 实现雪花算法

Python 实现雪花算法 雪花算法:雪花算法是一种分布式全局唯一ID,一般不需要过多的深入了解,一般个人项目用不到分布式之类的大型架构,另一方面,则是因为,就算用到市面上很多 ID 生成器帮我们完成了这项工作。 介绍:Twitter 于 2010 年开源了内部团队在用的一款全局唯一 …

Python小游戏——外星人入侵(保姆级教程)第一章 06让飞船移动

Python小游戏——外星人入侵(保姆级教程) 第一章:武装飞船 06:让飞船移动 下面来让玩家能够左右移动飞船。我们将编写代码,在用户按左或右箭头键时做出响应。我们将首先专注于向右移动,再使用同样的原理来控制向左移动。通过这样做,你将学会如何控制屏幕图像的移动。系列…

web安全 - xss攻击与防御

xss(Cross-Site Scripting), 跨站脚本攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。 利用恶意脚本攻击者可以获取用户的敏感信息,Cookie, SessionID等,进而危害数据安全。 1. xss 类型 1. 存储型xss: 恶意脚本来源于数据库 由于恶意代码存储在服务器…

[NOIP2001 提高组] 一元三次方程求解

题目链接:https://www.luogu.com.cn/problem/P1024 试题分析: 三个答案都在[-100,100]范围内,两个根的差的绝对值>=1,保证了每一个大小为1的区间里至多有1个解,也就是说当区间的两个端点的函数值异号时区间内一定有一个解,同号时一定没有解。那么我们可以枚举互相不重叠…

oracle时间对比报错:ORA-01861 文字与格式字符串不匹配

前段时间写一个简单的需求时碰到的,在使用传入的时间参数与oracle数据库里存的时间进行比较时报错,具体错误如下:在Oracle中,需要使用to_date 格式化时间,再进行对比SELECT * FROM XXXXXXX t WHERE t.DATE BETWEEN to_date(2021-07-08 00:00:00,yyyy-mm-dd hh24:mi:ss…

大家都能看得懂的源码 - 封装一个管理 url 状态的 hook

本文是深入浅出 ahooks 源码系列文章的第十一篇,该系列已整理成文档-地址。觉得还不错,给个 star 支持一下哈,Thanks。 本文来讲下 ahooks 中的 useUrlState。通过 url query 来管理 state 的 Hook。useUrlState 的特殊 在之前的架构篇中我们就提到,ahooks 这个项目是一个 …

Element Ui使用技巧——Form表单的校验规则rules详细说明;element的 form 表单rules详细用法

介绍 Form 组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则,并将 Form-Item的 prop 属性设置为需校验的字段名即可。校验规则参见 async-validator文档中提及的用法有2种: 官方form 表单文档 https://element.eleme.io/#/zh-CN/component/form 1.对整个…

ssh连接windows10拒绝连接-SSH入站-windows开启SSH

第一步:ssh使用的22端口,首先确认windows10的22端口是否开启。--开启步骤 1.控制面板-->Windws Defender 防火墙-->高级设置-->入站规则-->新建规则2.选择端口-->下一步3.选择TCP-->输入开放的端口-->下一步4.允许连接-->下一步5.勾选 域、专用、公用…

测试右移-后台服务监控告警实践

前言 前段时间,公司上线了“大屏”项目,用于对接展示一些业务平台的数据。但是在上线后使用过程中,产品或业务经常反馈前台页面没有数据。出现这种情况后,开发人员会去排查问题,解决后再通知产品或业务人员解决修复情况。虽然研发每次都能在较短的时间内响应并解决问题,但…

windows许可证即将过期?快来小编告诉你解决方法

https://baijiahao.baidu.com/s?id=1598094917004791962&wfr=spider&for=pc很多使用win10系统的用户都有遇到过电脑提示你的windows许可证即将过期的问题,遇到许可证即将过期要怎么办呢?小编这里给大家介绍一下这个问题的解决方法。Windows系统都需要激活后才能使用…

TypeScript 数组中查找最小、最大n个元素

TypeScript 数组中查找最小、最大n个元素var typeArr:number[]=[1,10,50,6,80,9,100];//最小元素private minArr(arr:number[]){let minArray:number[]=[];//3 就是返回多少个for (let i = 0; i < 3; i++) {let min = arr[0]; for (let j = 0; j < arr.length…

多列转两列(Power Query)

问题:多列转一列,如下图,左表转成右表let源 = Excel.CurrentWorkbook(){[Name="表2"]}[Content],拆分列 = Table.ToColumns(源),列分组 = List.Split(拆分列, 2),列合并 = List.Transform(列分组, each Table.FromColumns(_)),升表头 = List.Transform(列合并, ea…

Android开发

1.知识点解析 1.1 dimen1.尺寸资源;2.在工程的res\layout\目录下创建一个test_dimen.xml布局文件。3.在该布局文件中添加一个TextView和一个Button。4.TextView的宽和高引用尺寸资源来设置,android:width="@dimen/text_width"5.dimen定义:<resources><di…

项目管理 WBS 分解法 All In One

项目管理 WBS 分解法 All In One Work Breakdown Structure 工作分解结构项目管理 WBS 分解法 All In OnePMPWork Breakdown Structure / 工作分解结构WBS工作分解结构跟因数分解是一个原理,就是把一个项目,按一定的原则分解,项目分解成任务,任务再分解成一项项工作,再把一…

如何在电脑桌面上显示待办任务清单?

如果你每天的待办工作任务都是很多的,那么你应该如何保证自己能够把每条待办任务管理的井井有条,并且按时完成每项工作任务呢?相信这是很多职场人士都面临的一个难题,每天的工作时间都是固定的,但工作任务却是又多又繁杂,所以就需要大家通过管理待办任务来提高办公效率。…

Stream流-流式思想概述和获取流

流式思想概述 整体来看,流式思想类似于工厂车间的“生产流水线”。 当需要对多个元素进行操作(特别是多步操作)的时候,考虑到性能及便利性,我们应该首先拼好一个“模型”步骤 方案,然后再按照方案去执行他 这张图中展示了过滤、映射、跳过、计数等多步操作,这是一种集合…

仓库的种类和彼此关系与Maven标准目录结构

仓库的种类和彼此关系 仓库分为三类:本地仓库,远程仓库,中央仓库 三类仓库直间的关系:在默认情况下启动一个Maven工程会从本地仓库找jar包,如果本地没有在连网状态下会从中央仓库下载jar包在公司中启动一个Maven工程会从本地仓库找jar包,本地没有会去远程仓库下jar包,如…

Fecify 自建私有化saas跨境商城系统

作为跨境的运营者,有多站需求的用户,可以通过wp,magento,fecmall等搭建多个跨境独立站,需要每个独立站单独安装,安装模板插件,配置等等,后续的管理维护比较繁琐,大多数的开源性能低下,插件安装冲突,模板调整问题等等,对于没有技术的个人和小公司,掌控难度高,很多…