Notifications
Article
Unity 2019.1正式版功能介绍(2)-引擎
Published 5 months ago
483
0
本文,我们将介绍Unity 2019.1正式版中引擎核心的新功能与改进。

面向数据技术栈DOTS

Burst编译器脱离预览阶段
在Unity 2018.1中,我们加入了Burst编译器,这是一种基于LLVM的全新后端编译器技术,它会使用C# Job为目标平台生成高度优化的机器代码。在新版本中,Burst编译器脱离了预览阶段,支持用于正式制作。
使用Burst编译器时,你不必处理复杂的底层编码工作,也不必通过手动调整汇编语言来获得性能提升,你可以直接使用C#语言编写代码。
如下图所示,我们可以使用Burst检视窗口查看作业和机器指令,以及原始的C#源代码。

新的音频渲染和混合工具(实验性)

DSPGraph是全新的音频渲染和混合工具,基于Unity的C# Job System构建。该工具可以通过C#代码扩展,能够和Burst编译器一起使用。
在《Megacity》演示项目中,该工具支持10万个分散的3D空间音效发射器,包括:霓虹灯、空调风扇和汽车,实现出丰富逼真的音效环境。
请注意:DSPGraph是一个内部的实验性API,我们计划今年晚些时候将其作为预览版资源包处理和发布,它将成为面向数据技术栈DOTS音频系统的基础。

Sub Scenes子场景(实验性)

Sub Scenes子场景属于《Megacity》项目开发工具组的一部分,该功能弥补了游戏对象和DOTS技术之间的隔阂,使用游戏对象场景作为分组机制,批量转换游戏对象为实体。
在开发《Megacity》这类大型项目时,其中数百万个游戏对象被转换为实体,Sub Scenes子场景功能会现锝非常实用。由于开发者一次只需要处理有限的子场景,编辑器中的项目会变得更好管理,也更高效,我们把这种方法称为“混合”工作流程。
除了改进编辑器工作流程,开发者也可以使用转换后的子场景作为流处理单位,它们可以在游戏期间加载和卸载,也可以在编辑器中异步加载。
通过添加SubScene组件到根游戏对象上,你可以把一组游戏对象转换为实体。如果希望在子场景编辑游戏对象时,只要打开它并进行改动即可。在完成编辑并关闭游戏对象子场景后,游戏对象组会自动转换为实体。
在子场景对游戏对象进行改动不会影响根场景,这样方便多个团队成员在不同子场景同时进行协作。
Sub Scenes子场景功能是Entities资源包的一部分,可以在资源包管理器找到。该功能目前处于实验阶段,尚未提供支持文档,因此请谨慎使用。

Megacity

在短短两个月内,Unity ECS团队和FPS示例项目的二位艺术家一起合作开发了《Megacity》项目,在这座未来风格的超大城市景观中,遍布着飞行的汽车,成百上千个精致的游戏对象和独特的音频源。
开发团队利用了面向数据技术栈DOTS,汇集了”默认高性能实现”的所有工具项目,包括:实体组件系统ECS、C# Job System和Burst编译器。
《Megacity》展示了如何使用Unity 2019.1的DOTS技术开发复杂项目,以及如何利用Unity 2018.3加入的新预制件工作流程。《Megacity》项目现已正式推出,可供下载使用,用户可以开始尝试DOTS技术为新项目提供的机遇。
我们后续也会介绍Nordeus工作室的开发者对《Megacity》演示项目的处理方法,了解如何面向移动平台轻松地调整高分辨率PC项目。

基于DOTS技术的物理系统

在GDC 2019上,我们宣布和Havok展开合作,为Unity中基于DOTS技术的项目构建完整的解决方案。
如果项目使用新的DOTS框架,Unity Physics(预览版)是项目的默认物理系统,该系统使用C# DOTS框架编写,利用Burst编译器和C# Job System提供高性能模拟效果。
通过使用无状态的设计而不使用缓存,我们能够简化Unity Physics的复杂度,使开发者可以在我们改进该系统的同时,轻松进行调整,修改和学习。Unity Physics现在可以通过Unity 2019.1的资源包管理器获取。
今年6月,我们将提供Havok Physics资源包,它是针对DOTS技术项目的集成,以满足复杂的物理模拟需求。Havok Physics和Unity Physics一样,都使用了C# DOTS框架,但Havok Physics基于闭源专利技术Havok Physics物理引擎,由C++代码编写。
Unity Physics和Havok Physics使用了相同的数据协议,这意味着开发者只需一次构建内容和游戏代码,就可在Unity Physics和Havok Physics中使用。这样开发者可以无缝转变二个基于DOTS技术的物理解决方案,或者在项目中同时使用Unity Physics和Havok Physics。
如果你的项目使用游戏对象和MonoBehaviour框架,PhysX是默认物理系统。这一点不会变,我们会继续在Unity中面向基于游戏对象和MonoBehaviour的项目支持和处理PhysX更新。

PhysX改进

我们对面向非DOTS项目的PhysX解决方案加入了大量改进,例如:布料现在可以应用自身的重力效果,它独立于场景的重力,以便轻松进行调整。
我们也更新了物理调试视图的颜色,从而提供更好的使用体验,让视图里的颜色和辅助图示颜色保持一致。Rigidbody组件的检视窗口新增了一个部分,用来展示调试过程常用的内部信息,例如:线性速度和角速度,重心和惯性张量。
全新的Physics.GetIgnoreCollision函数可以轻松检查特定碰撞体是否禁用碰撞效果。物体的默认最大角速度从7提高为50,这会改进快速移动对象的模拟效果,也会改进特别配置中布娃娃的分辨率质量。该函数允许解算器更快地旋转物体,从而满足较少迭代中的限制。
物理多场景改进
此前,我们在多场景环境中仅支持光线投射。在Unity 2019.1中,所有场景查询都可以在多场景环境使用。
Physics Debug物理调试视图也支持多个物理场景,允许开发者查看选中对象属于哪个物理场景,开发者也可以查看属于特定物理场景的所有对象。

IL2CPP与性能

我们改进了启用脚本调试过程的运行时性能,此外,IL2CPP生成代码的性能提高了20%。
性能分析器更新
我们改进了Unity Profiler性能分析器和外部性能分析器的集成效果,Unity的开发构建现在会为Android Systrace工具生成标记,允许开发者在系统范围跟踪的Android Systrace工具中,可视化以Unity事件命名的部分。
开发者可以在OS活动的环境中分析游戏,例如:进行调度,CPU状态和运行在系统的其它处理过程。之前作为插件的Systrace支持现在已经是Unity 2019.1的一部分。
所有托管线程现在可以在Mono和IL2CPP编译后端看到,所有本地Unity线程都会公开。线程上的活动会展示在性能分析窗口的时间线视图,我们也会自动为性能分析器注册所有线程。
此外,我们会提高性能分析器可用内存量的默认值,在播放器提高到4MB,在编辑器提高到64MB,这允许开发者积累更多数据,然后再传输到硬盘或网络上,并且减少开销。
开发者也可以使用“-profiler-maxusedmemory”命令行参数控制可用内存量。我们添加了UnityEditor.Profiling.HierarchyFrameDataView API,它可以快速为所有线程遍历CPU性能分析数据,在性能分析窗口的层级视图提供所有信息,以及所有相关的元数据,例如:GC.Alloc调用栈。
Profile Analyzer(预览版)
Profile Analyzer是全新的预览版性能分析工具包。它补充了Unity性能分析器的单帧分析功能,加入同时分析多个帧的功能。该资源包很实用,特别是需要较大的性能视图时,这种情况包括:升级Unity版本,测试优化效果,或在开发过程跟踪性能变化。
Profile Analyzer工具包会分析从活动帧集合加载的CPU帧和标记数据,它们可以从当前的Unity性能分析器加载,也可以从之前保存的Profile Analyzer会话加载。
经过分析的CPU帧和标记数据会使用直方图和箱线图来表示,这些图表补充了每个标记活动的分类列表,包括:最小值、最大值、平均值、实例数量、范围和标记首次出现的帧。
Profile Analyzer的对比视图让开发者可以同时加载二个数据集,以衡量优化,设置改动或Unity版本更新产生的效果。
综合筛选系统可以在单视图和对比视图使用,以限制标记,线程,帧和栈深度的分析。
增量式垃圾回收(实验性)
在Unity 2019.1中,我们加入了Incremental Garbage Collector增量式垃圾回收功能,作为已有垃圾回收功能的实验性替代功能。
增量式垃圾回收可以把任务分解为多个部分,这样不必为了执行垃圾回收而长时间中断程序执行,它会用多个短时间的中断来完成。
虽然该方法从整体上不会让垃圾回收过程变快,但它能通过分配工作量到多个帧,显著减少GC峰值对动画流畅性的影响问题。更多相关信息,请阅读《Unity 2019.1 新功能:增量式垃圾回收》。

ScriptableObjects可编程对象的重新加载

ScriptableObjects可编程对象现在可以在资源导入阶段进行重新加载,这意味着如果可编程对象在导入前加载,而磁盘上的基础资源已被修改,那么可编程对象会进行重新加载,并在导入完成后获得磁盘资源的新数值。
在这次改动前,可编程对象会在导入后卸载,导致可编程对象在使用等于运算符(==)对比时等于Null。这种重载过程仅发生在导入(或重新导入)前已经加载的可编程对象和嵌套预制件。
更多关于重载可编程对象的信息,请查看代码示例:https://gist.github.com/volblob/200d3f97c93bbafcca53a51487d94492

程序集定义文件:Version Defines版本定义

在Unity 2019.1中,资源包开发者可以通过Assembly Definition File检视窗口的全新Version Defines版本定义功能,有条件地依赖资源包中的C#代码。
软引用
现在丢失程序集定义文件引用时会被无视,不会产生丢失引用的错误,它允许开发者给asmdef程序集添加引用。
Version Defines版本定义
通过使用Assembly Definition检视窗口的全新Version Defines版本定义功能,开发者可以定义哪些C#预处理指令会根据项目有关的资源包版本范围和模块而设定,这样允许开发者在可选资源包中用#if指令处理C#代码。

小结

我们将在下一篇中介绍Unity 2019.1编辑器相关的功能改进,包括:预制件、编辑器控制台,快捷键管理器、动画、启动器等内容,敬请期待。
Tags:
Unity China
677
Comments