Cocos Creator v1.6 版本发布了!感谢社区对这个版本漫长测试周期的耐心等待和对测试版的积极试用和反馈。我们在这个版本更新中继续连结了优化性能和提升体验的传统,而且这个版本还是后续一系列重要的引擎进化的开始。
我们希望改善开发者编纂器使用体验的同时,不停提升 JS 和 C++ 引擎的性能,解决开发者最关心的包体、缓存、网络通讯等问题。基于这个目标,我们在 v1.6 版本中加入了下列重要功能。
特色功能
- JavaScript-Binding 绑定层升级,,大幅提升安卓平台性能
- 预览游戏时脚本免打包,改动脚本后瞬间刷新游戏
- 批量编纂节点和组件属性
- web平台构建时自动将版本加入资源文件名
- 升级 iOS 平台的 WebSocket 库,解决大部分平台专属网络通讯问题
JavaScript-Binding 绑定层全面升级
在这个版本中,我们升级了从 JavaScript 脚本到原生平台 C++ 绑定的中间层,一方面我们将原生平台使用的 JavaScript 引擎 SpiderM 从 v33 版本升级到了 v52 版本,大幅度提高了安卓平台的 JavaScript 运行性能(由于 iOS 平台上不支持开启 JIT 所以效果并不明显);另一方面我们在这个版本开始对绑定层接口进行重构,目标是:
- 提供完全抽象的 JSB 绑定层 API,独立于 JavaScript 引擎,用户的绑定代码将不再受未来 JS 引擎升级影响
- 支持平台原生的 JS 引擎,包孕 Android 平台的 v8,iOS 平台的 JavaScriptCore。
在升级绑定层后,我们不但为后续开发者的 C++ 层绑定开发提供了不变的环境,并且支持原生平台的 JS 引擎会使得构建原生版本时的包体大幅减小,因为不再需要将 SpiderM 引擎库加入到发布版本中。
预览游戏时脚本免打包
由于脚本模块化加载的需要,我们从 Cocos Creator 第一个版本开始就对用户的脚本进行编译打包,但对于规模庞大、动辄几百个脚本的项目来说,每次修改任何脚本都会触发整个编译打包流程,会使得修改脚本后的等待时间非常长。为了解决这个问题,我们从 v1.6 开始引入了编纂器环境下脚本免打包的模块化系统,可以在预览环境下别离加载单个文件的脚本。对任何脚本的改动将只触发该脚本自己的编译流程,使得开发脚本后刷新预览的周期缩短到1~2秒,大大提升开发效率。
目前构建后的脚本仍然需要进行打包,因为终端浏览器里没有相应的加载环境。我们会在后续继续研究构建发布时也能连结每个脚本文件独立存在的构建模式,来便利需要别离更新脚本的开发者更容易安排游戏版本。
批量编纂节点和组件属性
编纂 UI 场景时,经常会遇到需要选中一些节点并批量修改他们的一些属性的需要,这个版本我们加入了属性检查器的批量编纂功能。
多选节点后这些节点上共享的组件和属性就可以进行批量编纂了,当差别节点的某个属性值差别时,选中这些节点后,属性检查器上这个属性值会显示为 -, 修改这个属性会让所有选中节点上该属性都酿成同样的值。
web 平台构建时为资源文件名加入版本号
对 H5 游戏开发者来说,有效利用浏览器的缓存机制,制止用户重复下载资源,而且在更新游戏资源时确保更新缓存的资源版本是非常重要的。我们在这个版本的构建发布面板里增加了 **md5 cache** 构建选项,勾选后会在构建时为所有资源文件名增加该文件的 md5 码。这样在更新游戏版本时,按照文件名的差别,用户的浏览器会自动重新下载 md5 改变了的资源,在最大限度使用缓存节省流量的情况下确保版本的一致性。
iOS 平台上使用 SocketRocket 代替之前的 WebSocket 实现
我们用 facebook 开发的 [SocketRocket 库](https://github.com/facebook/socketrocket) 替换了之前一直在 cocos2d-x 和 Cocos Creator C++ 引擎中使用的 libWebsocket 库,这个全新的实现支持以下特性:
- SocketRocket 提供异步 API,更符合通讯习惯
- 封装了跨线程通讯
- 网络状态变换时不会造成连接关闭
- 锁定手机设备屏幕不再造成报错
- 不再依赖包体较大的 openssl 库
- 使用 wss 连接时不再需要当地 CA 根证书
后续版本中我们会对 socket.io 的原生实现也进行进一步的优化,希望能为开发者们提供一个简单、不变的网络通讯编程环境。
完整改动列表
- [Audio] [Breaking] 修复 `audioEngine.stop` 会触发 finish 事件回调的问题,现在 setFinishCallback 设置的 callback 只有在自然播放结束的时候
编纂器
- [Editor] 加入预览游戏时免编译脚本的模式,免编译模式下 VSCode 的调试配置需要通过开发者菜单更新
- [Editor] 移除内置代码编纂器,默认双击文本文件时会使用系统默认的应用打开
- [Editor] 修复 Windows 上编纂器运行路径和项目路径不在同一个驱动器时加载脚本路径错误的问题
- [Editor] 修复导出场景资源时引用量过大可能导致卡死的问题
- [Editor] 修复 require 第三方库时的报错 `can not find module for path : undefined`
- [Editor] editor-input 和 editor-textarea 控件添加 maxLength 支持
- [Editor] 禁止弹出和关闭部分核心面板,包孕场景编纂器、资源办理器和节点树。
- [Editor] 修复 TS 脚本在重命名后,旧的不会删掉导致脚本名称重复的问题。
- [Editor] 修复场景生存时仍有 “Cannot read property ‘_prefab’ of null” 的报错
- [Editor] 修复 property 装饰器在新版 VSCode 中的报错
- [Editor] 修复项目中脚本过多时会出现 `too many open files` 的问题
- [Editor] 修复编纂器中无法通过 url 加载资源依赖的 raw asset 的问题,修复编纂器无法正确加载 TSX 资源的问题
- [Editor] 修复编纂器里脚本文件加载挨次不固定的问题
- [Editor] 修复切换场景编纂模式时可能出现 `Possible EventEmitter memory leak detected` 的报错问题
- [Editor] 修复创建 ToggleGroup 时报错的问题
- [Editor] 修复选中编纂 plist 中的 spriteFrame 时可能 Sprite Editor 窗口会卡死的问题
- [Build] 构建 Web 端时加入插入 eruda 的选项
- [Build] 修复 windows 平台上构建 web 时使用 md5 cache 报错的问题。
- [Build] 构建时压缩和合并资源 uuid,以优化 settings.js 资源索引文件的体积。
- [Build] 修复某些项目会在 build-raw-assets 时卡住不动的问题
- [Build] 修复构建非调试版本时 settings.js 未被压缩的问题
- [Build] 修复构建时添加 md5 cache 导致部分组件无法正确获取资源引用的问题
- [Build] 修复构建 Android 时每次都会重新编译的问题
- [Build] 修复 TTF label 在使用 md5 cache 无法正确下载资源与加载字体的 bug
- [Build] 修复较低版本 Xcode 在编译 iOS/Mac 工程时可能遇到的 `undefined symbol: NSStreamNetworkServiceTypeCallSignaling` 编译失败问题
- [Build] 在 web 构建面板上面添加 md5Cache 选项,为资源文件名增加 md5 编码,用于正确更新客户端资源缓存。