在此感谢给予我们宝贵意见和建议的各位小伙伴们也提前祝大家端午节安康喔
这个版本中包含了许多新的功能与更新如资源管理系统重构、Asset Bundle、优化原生上 Label 渲染的性能、优化 Graphic 渲染效果等等。
相信全新的 2.4 版本将会让大家的工作更加高效、游戏内容更加丰富、体验进一步提升建议所有开发者升级
以下是 2.4 完整更新说明。为保证阅读体验[参考链接]统一放在文末~
Whats new
支持 Asset Bundle 功能
Asset Bundle 可将工程中的资源按照开发者的意愿进行模块划分将不同场景不同需求的资源划分在多个包中从而减少首次下载和加载游戏时的所需时间也可以跨项目复用用于加载子项目中的 Asset Bundle。
Asset Bundle 还提供了优先级、压缩类型等相关设置用于对 Asset Bundle 的包体和加载进行优化。
详情请参考[Asset Bundle]和[加载 Asset Bundle]。
新增 cc.AssetManager 模块用于资源管理
Asset Manager 是 Creator 在 v2.4 新推出的资源管理器其具备加载资源、查找资源、销毁资源、缓存资源、Asset Bundle 等功能。
Asset Manager 拥有更好的性能、更易用的 API、以及更强的扩展性。
其主要提供了以下几点新特性
支持所有资源的加载与预加载预加载能以更轻量的方式静默运行不影响运行效率
支持 Asset Bundle
支持更安全的自动释放机制释放资源时无需考虑其引用情况避免错误释放资源
支持下载失败重试、下载优先级、下载并发数等设置可根据各种情况进行调整
支持更方便地定制加载流程实现特殊效果
详情请参考[Asset Manager]和[动态加载]。
增加 Label 的混合选项
支持设置 Lable 的混合选项可在不同的场景下使用不同的设置以最大化文本渲染性能。详情请参考[系统文本的混合模式说明]。
原生平台上使用 FreeType 渲染 Label
提升 Label 初始化速度Android 提升 5 倍左右iOS 提升 3 倍
在使用 TTF 字体和 Char 模式时支持 Bold、Outline、Shadow 等效果
支持 Graphic 的抗锯齿效果
使用 SDF 技术优化 Graphic 的锯齿问题
支持其他小游戏平台的压缩纹理
编辑器进一步支持更多小游戏平台的压缩纹理限制只需在 Mini Game 项添加压缩纹理格式即可设置包括微信小游戏、OPPO 小游戏、vivo 小游戏等多个平台的压缩纹理格式。
完善原生热更新支持 [#2312]
2.4 进一步完善原生热更新能力优化了以下内容
添加获取更新包大小接口
对链接添加 MD5 参数对 CDN 更加友好
解决更新过程中断导致的资源丢失和错乱的问题
详细请参考[热更新范例教程]
新增 SafeArea UI 组件
该组件会将所在节点的布局适配到异形屏手机的安全区域内可适配 Android 和 iOS 设备详细可查看 [SafeArea 组件参考]
其它新增特性
增加压缩纹理缓存功能构建之后将压缩纹理进行缓存重复构建时将尽量复用缓存内容加快构建速度
在 Web 平台使用 ImageBitmap 加载图片提升预览和 Web 平台图片解析速度减少加载时的卡顿
编辑器属性面板支持拖拽数组赋值
升级 TypeScript 的版本到 3.9.2
升级原生平台的 V8 版本到 8.0.426.16
支持导入 GLTF 资源
在所有小游戏平台支持首场景分包功能
支持预览时进行模块剔除提升预览速度还能更早暴露错误的模块剔除设置
Improvements
优化 2D 粒子系统 free 和 relative 模式的性能 [#6236]
优化 ToggleContainer 获取 toggleItems 的效率 [#6569]
提升原生平台 WebSocket 带宽 [#2353]
SpriteFrame 资源增加 None Trim 类型可快速设置为无裁剪
完善 jsb 的代码提示
支持设置预览端口
原生桌面平台构建时可设置窗口大小
Engine
[CORE]修复 cc.easeBackOut 在 time 为 0 时返回值不正确的问题[#6728]感谢 chen-gaoyuan
[CORE]修复 Node.walk 遍历错误的问题 [#6710]
[CORE]修复调用 cc.dynamicAtlasManager.showDebug 报错的问题 [#6697]
[CORE]修复 onLoad 中设置节点的 size 无效的问题 [#6688]
[CORE]修复按钮禁用状态下的材质将背景材质重置回默认材质的问题 [#6562]
[CORE]修复 BMFont 配置数据不存在时的报错 [#6472]
[CORE]修复开启预乘后透明度无效的问题 [#6451]
[CORE]修复 Camera.render() 渲染两次的问题[#6355]感谢 大城小胖
[CORE]修复调用 Texture2D.setPremultiplyAlpha 之后图片翻转的问题 [#6602]
[PARTICLE]修复 2D 粒子系统 relative 模式节点旋转时粒子跟随的问题 [#6236]
[3D]修复 3D Label 在 char 模式下不显示的问题[#6882]
[3D]修复勾选 Enable Auto Batch 选项并切换 Mesh 资源导致渲染错误的问题 [#6901]
[3D]修复渲染单个 Camera 阴影错位的问题 [#6477]
[3D]修复 effect 中 cc_matProj 错误的问题 [#6653]
[EDITBOX]修复 number 模式下EditBox.maxLength 属性不生效的问题 [#6725]
[EDITBOX]修复 EditBox 在 ScrollView 里滚动时无法更新位置的问题 [#6634]
[TILEDMAP]修复 Tiled Map 渲染顺序可能错误的问题 [#6284]
[TILEDMAP]修复 Tiled Map 隐藏的图像还是会渲染的问题 [#6309]
[SPINE]修复 Spine 纹理使用压缩纹理后渲染错误的问题 [#6483]
[SPINE]修复 Spine 贴图可能渲染错误的问题 [#6584]
[SPINE]修复贴图设置为预乘后DragonBone 与 Spine 渲染错误的问题 [#6696]感谢 大城小胖
[DRAGONBONE]修复 DragonBone 在销毁场景时一直报错的问题 [#6553]
Native
修复屏幕翻转后节点缩放不正确的问题 [#6689]
修复安卓原生 JniHelper 不是线程安全的问题 [#2457]
修复 unzip 不是线程安全的问题 [#2131]感谢 benloong
修复安卓 EditBox 的完成按钮被虚拟导航栏遮挡的问题 [#2426]
修复 Spine 节点在 iOS 上无法获取节点大小的问题 [#273]
修复原生 Effect 中 cc_time 错误的问题 [#6586]
修复 iOS 音频播放可能崩溃的问题 [#2358]
修复节点旋转计算错误的问题 [#2361]
修复设置 Label.string 时编码错误导致崩溃的问题 [#2395]
修复游戏退出时出现报错 [#2406]
修复屏幕旋转后输入框会将视图上推的问题 [#2415]
修复 Spine 3.6.53 版本导出的 JSON 文件里的路径动画解析失败的问题 [#2413]感谢 laomoi
修复 Android 上重力感应错误的问题 [#2231]
修复 Tiled Map 当节点挪动到没有地块信息的位置时不会被渲染的问题 [#2283]
修复原生 WebSocket 接口与 Web 不一致的问题 [#2297]
修复调用 Camera 的 render 方法会导致 Spine 加速播放的问题 [#258]
修复安卓平台剔除 AudioSource 模块导致 audioEngine 无法使用的问题
修复 Android 9, Android 10 版本号检测失败的问题 [#6466]
Web
修复 iOS Web-Mobile 摘下耳机后音频无法播放的问题 [#6730]
修复 WebView 透明度在 iOS 上错误的问题 [#6717]
修复 iOS 浏览器上输入中文后无法再输入英文的问题 [#6631]
Mini Game
修复微信小游戏 WebSocket 发送 Uint8Array 数据报错的问题 [#115]
修复音频意外中断时无法自动恢复播放的问题 [#118]
修复 PC 微信数据开放域无法运行的问题
Editor
修复 Sprite Editor 保存和还原状态不对的问题
修复在动画编辑状态下无法重命名不在编辑的动画剪辑的问题
修复增加 Spine 资源后编辑器无法识别出来的问题
修复用户插件重启后编辑器可能无法打开的问题
修复多次调用 getNativeAssetPaths 返回值错误的问题
修复脚本重命名后加载脚本失败的问题
修复点击图集会出现 width 和 height 报错的问题
修复使用自动图集图片可能失真的问题
修复导入某些图片导致资源面板错误的问题
修复 Prefab 编辑模式无法通过 delete 键删除节点的问题
修复勾选 Filter Unused Resources 在图集没有被导出时无效的问题
修复 effect 中定义宏的取值范围无效的问题 [#6616]
修复动画编辑器设置 CircleCollider.offset 属性异常的问题 [#6600]
修复还原上次保存无效的问题
修复设置预览浏览器无效的问题
修复导入 Cocos Studio 工程没有字体资源的话会出现报错的问题
修复多开可能造成编辑器错误的问题
Known Issues
使用远程 Asset Bundle 并勾选延迟加载时音频可能无法播放请使用 cc.assetManager.postLoadNative 加载后播放。
升级提示
Cocos Creator 对项目的升级操作是不可逆的请在升级前提交或备份旧版项目。
绝大多数项目通常都能自动升级但因为项目难免存在特殊性开发者应该根据项目自身需求提前对新版本引擎进行试用和评估。
此外出于稳定性考虑建议即将上线或已上线的项目谨慎升级。
以下是升级说明如果开发者们在升级中遇到困难欢迎向我们反馈我们会尽力协助喔。
从 <2.4.0 版本升级
cc.loader 已经不建议使用请使用最新的 cc.assetManager 来代替请参考 [资源管理模块升级指南]
子包功能已升级为 Asset Bundle请参考 [资源分包升级指南]
调整了项目构建后的目录结构调整了 BuildResults 的 API如果你使用了编辑器插件获取编辑器构建结果请参考 [定制项目构建流程升级指南]
从 1.10 开始废弃的 cc.RawAsset 已被正式移除请使用 cc.Asset 代替。由于 2.4 不再兼容原有 1.x 项目中对 RawAsset 类型的历史遗留用法建议所有要升级到 2.4 的项目特别是从 1.9 版本一路升级上来的项目先在任意的 1.10 ~ 2.3 版本中对编辑器编译代码时输出的所有警告或报错都正确处理完毕再升级到 2.4。
cc.Color.fromHex 已被废弃请使用 cc.Color.fromHEX 接口
从 <2.3.3 版本升级
Effect 中的 CCTexture2DCCTexture2DRGB 方法已被废弃请改用 CCTextureCCTextureRGB
Vec3.FRONT 已被废弃请改用 Vec3.FORWARD
从 <2.3.0 版本升级
从 2.3.0 开始定制安卓原生工程时需注意 Android 与 Android Instant 使用了同一个构建模板。
如果是 Android 平台单独使用的代码请放入 app/src 目录, 单独使用的第三方库请放入 app/libs 目录。
如果是 Android Instant 单独使用的代码和第三方库请分别放入 game/src, game/libs 目录。
如果是 Android 和 Android Instant 共用的代码和第三方库请分别放入 proj.android-studio 根目录底下的 src 目录和 libs 目录。
proj.android-studio 根目录底下 jni/CocosAndroid.mk , jni/ CocosApplication.mk主要用于配置引擎相关的配置开发者的配置建议 Android 放到 app/jni/Android.mk 和 app/jni/Application.mk 中Android Instant 请放入 game/jni/Android.mk 和 game/jni/Application.mk 中。
此外在 Cocos Creator 编译 Android 时会默认执行 assembleRelease/Debug编译 Android Instant 时会执行 in stant:assembleRelease/Debug。
如自定义了音频前后台切换时的暂停逻辑升级到 2.3.0 后请移除。
目前 Creator 游戏在所有平台上前后台互相切换时都会在内部自动暂停和恢复音频。
如果开发者之前有对这一块进行过定制监听并执行了 cc.audioEngine.pause()/resume() 之类的音频操作可能会和引擎默认行为冲突。如果有遇到相关的音频问题只需移除相应的定制代码即可。
从 2.0 - 2.3.0 版本升级
从 2.3.0 开始Canvas 组件不再负责将 Canvas 节点尺寸设为屏幕大小此行为将结合 Widget 组件实现。为保证兼容性2.0 项目升级后Canvas 所在节点会自动添加 Widget 组件。从 1.x 项目升级无此问题
从 <2.2.0 版本升级
从 2.2.0 开始我们强化了内存管理机制现在要求用户通过代码动态创建且独立于场景节点树的 cc.Node 必须通过 destroy() 释放否则引擎无法知道何时回收这类节点的内存会导致内存泄露。
如原先手动从场景中移除的节点在不需要用到的时候也需要统一 destroy()
// 假设 testNode 是场景中的某个节点若之前被手动移出场景了如testNode.parent null;// 或者testNode.removeFromParent(true);// 或者parentNode.removeChild(testNode);// 若往后 testNode 还会再次用到则无需手动 destroy 该节点// 否则应该手动调用testNode.destroy();
如原先通过 cc.removeSelf 这个 action 销毁节点请改为使用 cc.destroySelf。
如原先通过 cc.NodePool 管理节点则不受影响。
从 2.2.0 开始我们不再建议你使用节点的Skew 功能。
Skew 通常用作在 2D 引擎中模拟 3D 效果随着 Cocos Creator 对 3D 节点的深入支持Skew 效果已经完全可以由 3D 节点来实现。
所以为了统一使用体验进一步优化引擎底层实现我们废弃了 Skew 属性。
不过我们依旧会保留一段时间内的向下兼容开发者可在旧项目中延续原有做法。后续我们将进一步完善兼容方式和升级案例择机正式移除 Skew 功能。
从 <2.0 版本升级
打开 1.x 项目的话场景等所有资源将会自动升级代码中的废弃接口从 2.3.3 开始将会在保持兼容的基础上同步输出报错。
升级方式可参考[1.10 资源升级指南]和[2.0 升级文档]进行调整。
答疑
3D 项目应该用 Creator 2.x 还是 Creator 3D
随着 Creator 2.x 对 3D 的支持越来越完善以及 Creator 3D 自身的发展也越来越成熟我们也遇到了不少开发者在立 3D 项目时的疑问既然 Creator 2.x 和 Creator 3D 版都支持 3D那么我应该选择哪一个引擎
在这里我们顺便统一解答下
1. 如果需要集成 TiledMap、Box2D 或者 Spine或者想要更稳定和高性能的 UI/2D 表现或者想要发布到原生平台暂时只能用 Creator 2.x。
2. 如果 3D 场景特别多或者特别大或者有骨骼动画融合、换装、过渡等表现需求或者需要更高级别的渲染能力只能用 Creator 3D。
3. 简而言之如果是 2.5D 项目通常采用 Creator 2.x如果是纯 3D 的轻度项目一般两个引擎都能胜任如果是 3D 重度项目通常采用 Creator 3D。
当然以上判断标准并不是绝对的我们也遇到能力强的开发者在 2.x 上实现了大地形及次世代效果甚至从 3D 往 2D 移植了 GPU 粒子、GPU Instancing、GPU 骨骼动画等功能。
开发者可以在立项前期对两个引擎进行充分的技术预研、压力测试结合团队自身实际情况进行选择。