Cocos Creator 3.7 重磅发布!一文解读全新功能与特性
2023.02.09 by COCOS
版本更新

Cocos Creator 3.7.0 是我们在不断挑战和提升自我路径上的又一力作。为了应对爆发的元宇宙需求以及支持更流畅更真实的 3D 世界,我们在渲染效果、GI 全局光照、LOD、动画系统、物理系统、易用性以及性能方面进行了众多提升。由于 3.7 版本更新众多,包含了大量的体验优化和缺陷修复,在此只列出重要更新,其余更新可以参考我们 GitHub 上的更新列表

 

场景渲染

光照探针

GI 全局光照是提升 3D 渲染真实感的关键基础设施。在此之前, Lightmap 可以用来烘焙静态物体的间接光照,但是对场景中的动态物体则无能为力,如角色和场景中移动的物体,这样容易造成视觉效果不统一的问题。光照探针可以提前通过烘焙记录空间中各点的光照信息,然后在物体运动时根据记录在探针中的结果模拟间接光照,对场景中的动态物体也提供高质量的全局光照支持。同时,光照探针还具备良好的运行时的处理性能,预计算也相当快。更多介绍详见《光照探针》

 

应用光照探针的角色:

使用光照探针实例化绘制的球体:

光照探针编辑:

 

反射探针

为了进一步提升渲染效果以及提升 3D 项目的沉浸感,我们加入了反射探针支持。它可以在场景中带有反射性质的材质上,渲染出真实的对周边环境的反射,此功能对画面的真实感提升是非常巨大的。它通过空间内某一点对附近区域的环境进行烘焙,在把周围环境信息储存后,应用在范围内有反射材质的物体上以实现真实环境反射的一种手段。在 3.7中,我们加入了具有两种模式的反射探针:Cube 烘焙模式用来烘焙一定空间范围内的立体环境。Planar 平面实时反射模式主要用来模拟平面上的反射,如光滑地面、水面等。更多介绍详见《反射探针》

 

模型 LOD

LOD(Level of Details)是常用的一种大型场景优化手段,核心在于对远处或者不重要的物体,降低其显示细节,以达到提升渲染效率的目的。3.7 加入了模型 LOD 支持,可根据物体显示在屏幕上的尺寸比例,动态切换合适的模型精度,节省渲染资源。更多介绍详见《多层次细节》

 

CSM 阴影层过渡

CSM 层级阴影最明显的一个效果问题就是在不同层级之间的阴影精度不同,导致在接缝处可能产生比较违和的割裂感,尤其是随着相机的移动,不同层级的拼接位置也在不断变化,导致很容易被发现的接缝移动现象。在 3.7 中,我们新增了 CSM 层过渡的支持,混合不同层级的渲染效果,使两个 CSM 阴影层级间过渡更加平滑。

 

后处理流程:Bloom & FXAA

基于 RenderGraph 的 自定义管线 中新增了 Bloom 后处理特效和 FXAA,将作为后处理定制的标准方案供大家参考。与旧的渲染管线难以扩展与配置不同,新的基于 RenderGraph 的自定义管线的可插拔结构使扩展管线的功能更加容易,同时对于 Forward/Deferred 渲染的输出结果进行后处理特效(如:Bloom 等)的新增也会更加便捷。

 

编辑器

 

原生场景编辑器(实验性)

3.7 的场景编辑器可以运行在以 C++ 为基础的 Windows/Mac 原生 Cocos 引擎之上,而不是原先以 JS/WebGL 为基础 HTML5 引擎。这意味着编辑器有潜力充分发挥 Cocos 引擎在原生端的性能优势,为各类元宇宙场景、3D 开放世界做好准备。此功能目前处于实验性状态,需在偏好设置 - 实验室开启 Use native engine for scene editor 开启试用。开启后,编辑器支持打开一个与 Scene 并存的独立 Game 面板,用于多窗口项目预览以及调试。

 

全新扩展管理器

3.7 升级了扩展管理器,采用了全新的 UI 并且支持一键安装和更新扩展插件,还支持记录和安装项目所依赖的扩展,让项目的分发更加方便。

为了实现更好的版本管理,提高扩展稳定性,新版扩展管理器也调整了一些管理机制:

  1. 3.7 开始编辑器将不再读取全局目录下的扩展,老项目升级到 3.7 时将会自动复制全局插件到项目中。此功能通过配套的 Dashboard 1.2.4 实现,请先确保本地 Dashboard 已自动更新至 1.2.4 版本。

  2. 从扩展管理器中安装的扩展将记录依赖关系,通过 Dashbord 1.2.4 以上版本打开项目时会自动检查并安装依赖的扩展。此功能目前还不支持 Store 中的插件,我们将在之后的版本中继续完善。

  3. 开发中的插件可以通过点开扩展管理器上方的导入按钮小箭头,选择开发者导入(Developer Import),此功能将为外部插件创建软链接到项目中,避免了插件同步问题。

  4. Store 中的插件如需共用,在 3.7.0 仍与之前一致,需要在各台电脑上分别手动安装,或者将插件内容上传到 Git 版本库。

 

插屏设置功能更新

插屏设置用于在游戏启动时对 Cocos 或您的品牌进行露出,同时加速首屏启动时间,给用户更好的体验。在 3.7 我们开始着手对此前维护力度不足的插屏设置功能进行翻新,在收集了不少用户反馈,结合 Cocos 自身的业务需要后,插屏设置功能得到了初步重构。目前做出的主要调整如下:

  • 暂时移除问卷调查界面,可以自由开关插屏显示(将来问卷仍会是必要的)。

  • 移除背景颜色设置功能,目前仅支持黑色。

  • 最小插屏显示时间修改为 500 毫秒。

项目设置:

构建面板:

 

资源管理

  • 支持压缩纹理启用 Mipmaps,启用后编辑器会将压缩纹理的 Mipmaps 预先生成并一同导出。

  • 新增 .exr 图片格式支持。

  • 支持翻转图片绿色通道:

  • 在编辑器的资源管理器移动或者重命名 ts 脚本时将自动更新 ts 中的导入路径,如需开启此功能请在偏好设置中的实验室开启此项开关:

  • 新增了 Mesh Optimizer 的 simplify 减面算法,新的算法不再改变 Prefab 结构,并且 fbx 减面效果更稳定,不易丢失材质。
     

网格体 UV 检查

3.7 支持在 Mesh 的属性检查器中显示各个通道的 UV,方便用户快速确认导入模型的 UV 或者 Lightmap 的 UV 是否正确,是否在(0,1)的区间内,是否有重叠等信息:

 

框架能力

 

Marionette 动画系统

  • 支持动画图变体。动画图变体是一种新的动画资产类型,允许用户在一个动画图的基础上创建变体,使其有可能在不同的角色上重复使用同一个动画图:

  • 动画状态机混合预览面板更新,支持用户更直观方便的在动画图中预览混合的结果:

  • 动画图支持节点拷贝粘贴功能

  • Class AnimationController 增加了动态覆盖动画图谱中的动画片段的方法

  • Class AnimationController 增加了查询动画图谱中层数的方法

  • 动画图编辑器:增加了一个右键菜单,可以把运动状态变成 sub-statemachine 状态

  • 优化了状态读取方法

 

优化粒子系统性能

调整 CurveRange 的构造逻辑,延迟构造底层曲线数据,同时优化了内部装饰器,加快粒子系统初始化速度。在不同复杂度的粒子下均有可观的性能提升。

和 3.6.2 粒子加载速度对比(加载时间越小,加载速度越快,粒子使用的功能模块越多,提升越明显):

 

其他性能优化

除了粒子加载速度以外,其他不少模块也有了不同程度的性能优化,其中包括以下几个比较显著的方面:

注:图示中每个平台下都会不断增加负载进行性能测试数据采集,不同平台之间负载并不一致,统一在帧率上进行差异展示,所以数值越高越好

  1. Frame Animation 帧动画


  2. 3D 模型渲染


  3. 3D 物理

 

3D 物理系统

  • 在物理系统中添加固定约束 FixedConstraint。

  • Point2Point 约束在 PhysX 物理物理后端使用 SphericalJoint 实现。

  • 物理系统支持 lineStripCast, 用于近似曲线检测 :

  • 默认物理材质支持在项目设置中通过文件配置。

  • 修复了 bullet 刚体无法休眠 sleep 的问题

  • 对 Bullet MeshCollider 设置 mesh 的时间提升了大约 100 倍运行速度。

  • 修复了 bullet 内存释放的功能。

  • 修复 PhysX 后端在刚体生成后动态设置 Mesh Collider 的 convex 属性失效的问题。

  • 统一各个物理后端在节点缩放时 cylinder collider 和 cone collider 的表现。

  • 修复 PhysX 原生后端(C++)发送大量错误事件的问题。

 

2D 物理系统

  • 修复 box2d shape2d中apply() 方法没有对 node 以及碰撞体状态进行判断的问题。

  • 修复 box2d 中 syncRotationToPhysics() 没有使用场景节点的世界旋转的问题。

  • 修复 box2d 中 aabb 准确度的问题。

  • 修复 box2d joint2D anglelimit 中角度转化问题问题。

  • 修复 physics2d-builtin shape 编组时的没有检查 Collider 状态的问题。

  • 新的 Physics2d Box2d::syncSceneToPhysics() 方法。

  • 修复 builtin-2d-physics removeShape() 速度慢的问题。

  • 添加了新的多边形切分算法:Hertel Mehlhorn。

  • 优化 physics-2d 中没有 connectedBody 时的设置。

  • 支持在编辑器中切换 physics-2d 后端。

 

更多

  • 【场景渲染】增加 Sorting 渲染排序组件,并提供排序层顺序编辑接口,用户可以使用此组件控制 MeshRenderer 或者 SpriteRenderer 的渲染顺序。

  • 【场景渲染】增加 FXAA HQ 以修正某些场景下物体边缘的虚影。

  • 【场景渲染】优化各类与渲染相关的默认值,如默认的 PBR 材质参数、默认天空盒、太阳方向等。

  • 【新建项目】添加了一个新的高质量 3D HQ 模板,默认开启阴影与光照等相关设置以达到更高质量的渲染效果,省去了手动开启场景、物体、灯光等多重阴影和光照的设置过程:

  • 【构建发布】支持 Facebook Instant Games 发布平台,详见《发布游戏到 Facebook Instant Games》

  • 【构建发布】集成微信小游戏高性能模式开关:

  • 【构建发布】支持在构建过程中通过点击 “x” 按钮中断构建任务。

  • 【构建发布】支持构建任务排队,多平台构建时会更加方便。

  • 【场景编辑】为参考图像添加缩放属性。

  • 【场景编辑】场景摄像机添加曝光相关属性:

  • 【编辑器】对动画编辑器的显示布局以及操作进行了优化,提升易用性以及用户体验:

  • 【编辑器】资源管理器支持文件夹多选编辑。

  • 【编辑器】将项目设置中的物理配置调整为物理材质,旧项目的配置将自动迁移为物理材质。

  • 【编辑器】移动 Joint Texture Layout 到项目设置中。

  • 【编辑器】移动创建构建扩展到创建扩展面板。点击“创建扩展”后会跳转到创建扩展面板,然后在创建面板中选择模板,完成详细设置,创建成功会自动打开插件所在目录:

  • 【框架能力】节点提供了新的 Mobility 属性用于 Lightmap 烘焙设置:

- Static:视当前节点为不可移动物体或光源,烘培 lightmap 的直接和间接光。

- Stationary:视当前节点为不可移动高光光源,只烘培 lightmap 的间接光照和遮挡,直接光(高光等)仍实时计算。

- Movable:视当前节点为可移动物体或光源,不参与烘培 lightmap。

  • 【框架能力】优化了刷新 layout 布局的机制,删除了 layout 布局必须有子节点才会更新的限制。

  • 【原生框架】切换到 swig 来生成 JS 绑定代码,旧的 bindings-generator 工具现在已经废弃,生成所有 JS 绑定代码的时间成本减少到 3~5 秒。

  • 【原生框架】优化了 se::Object 的构造和销毁,删除了不使用的哈希操作。

  • 【原生框架】增加 se::Object:createObjectWithConstructor 方法,在 CPP 代码中通过 JS 构造器创建 JS 对象。

  • 【原生框架】支持在本地桌面平台(Windows、Linux、macOS)上向执行文件传递命令行参数。

  • 【原生框架】增加对 se::Object 创建、修改、检查 ES6 Map/Set 的支持。

  • 【原生框架】提供 cc::event::EventBus 和 cc::event::EventTarget,以简化引擎内的事件调度。

  • 【原生框架】删除 BaseNode 类,使用 Node 类来代替。

  • 【原生框架】native.Downloader 支持中止功能。

  • 【原生框架】支持 ios websocketServer。

  • 【原生框架】在 function-corpping 中添加网络模块。

  • 【原生框架】为 setUniform 添加预类型验证器。

  • 【原生框架】优化引擎包体。

  • 【文档】补全部分缺失的 API 文档,优化 API 文档内容。

点击下载最新版本,也期待能在论坛听到大家的声音,告诉我们你对 3.7 的建议和反馈,感谢各位开发者的支持!