Cocos Creator 3.8.5 正式发布,更小更快更多平台!

在 Cocos Creator 3.8.5 版本中,我们做了新一轮的优化。

在加载速度、代码裁剪、平台增强等多方面做了优化,提升了开发者体验和游戏性能。

希望能够助 Cocos 开发者们的产品更上一层楼。

一、加载速度优化

1、WASM 模块延迟加载

在早期版本中,Cocos Creator 在打包时就支持了 WASM 模块分离,使 WASM 模块可以放入分包之中,不占用主包包体。

a6159856c261149ea9a270b9d6c93c4b.png

在 3.8.5 版本中,我们支持 WASM 模块延迟加载,这对使用了 Box2D、Spine、Bullet 等 WASM 库的游戏非常有帮助。用户只需要在使用相关功能之前,调用下面的API函数,加载对应的 WASM 库即可。

  • loadWasmModuleBox2D

  • loadWasmModuleSpine

  • loadWasmModuleBullet

  • loadWasmModulePhysics

这样一来,开发者就可以控制 WASM 的加载时机,使 WASM 模块的加载不占用首屏时间,大大缩短玩家首次进入游戏的加载时长。

2、代码裁剪

在 Cocos Creator 3.8.5 中,引擎内部采取了多种方案组合,降低 2D 项目包体大小。

  1. 移除 web 平台 gfx 层无用的代码

  2. 构建引擎代码支持"内联枚举"功能

  3. Spine 模块包体优化,体积相比 v3.8.4 缩减 40% 左右

  4. 显示声明 ts 类的构造函数,避免生成无用代码

我们还会继续努力,确保纯 2D 项目的包体与 2.x 项目持平,同时尽可能减少 3D 项目。

二、CRP 管线优化

81c320410cd409636c28bf2fe3e86760.jpeg

v3.8.4  提供的可定制管线 CRP-Customizable Render Pipeline 受到了许多开发者的欢迎,同时我们也收到了非常多的反馈。在 v3.8.5 版本中,我们优化了若干反馈,并对管线进一步加强。

在 v3.8.5 中,我们完善了景深(DOF)等后期效果,自定义后效支持组件式添加,也进一步优化了性能和内存占用。

CRP 会在易用性、效果、性能和内存占用等方面持续优化,最终成为项目开发的主流选择。

三、平台增强

1、鸿蒙 NEXT

7fb18a919b1997f63c2b99c2a3807943.png

Cocos Creator 3.8.5 提供了华为完全自主研发的鸿蒙 NEXT 操作系统的发布支持,开发者通过发布面板即可一键发布到鸿蒙 NEXT 平台。

2、Google Play

36d757e8b5692b0ece63be88316d8412.png

Cocos Creator 3.8.5 提供了一键发布到 Google Play 的能力。与普通的 Android 发布相比有一些差异和便捷特性。

  1. 一键激活 ADPF(Android Dynamic Performance Framework),这是一个动态性能优化框架,可以更好地提升游戏的散热表现和CPU性能。

  2. 默认渲染后端为 VULKAN

  3. 可以配置应用程序图标

3、咪咕小游戏

c1df1500b6cf8437d65ad3c48c3fa506.png

Cocos Creator 3.8.5 支持一键发布到咪咕小游戏,并在发布时配置相关参数。

18f5b36f2f1dfef806aa4796286d150f.png

2024年,结合自身资源和行业趋势,咪咕游戏开始打造 “双特色” 游戏分发平台。启动了全新的小游戏合作政策:60% 分成,零投入、免费流量推广扶持等。开发者们可以多多关注。

四、编辑器提升

646c0488838762556bbe0729e766d7c9.jpeg

1、启动速度优化

Cocos Creator 3.8.5 中,我们优化了启动时的资源编译方案,项目启动速度提升约 30% 左右,后面我们还会继续优化启动速度,节省开发者项目启动时间。

2、升级 Electron

d21afd7d39729c22643fa6c55d1245b2.png

Electron 升级到 v31.3.1,使编辑器可以享受到新版 NodeJS 的增益,不仅能够提升性能,插件开发者们还可以使用新版 NodeJS v20.15 的 API 和特性。

3、场景编辑器点选规则优化

3.8.5 中,我们优化了场景编辑器中物体点选规则,当同一个区域物体较多时,会优先选中较近的物体。

4、属性检查器支持 Prefab 预览

34b55f328ed2cfcc0264cacf601720e8.jpeg

5、属性检查器支持 Spine 预览

b9497d5ca31874c35f4d2780d5a8d0b4.png

五、一些重要问题修复

  1. Node 的 position/rotation/scale 等设置方法改回和 v3.8.3 一样的方式。

  2. 修复构建时自动图集压缩纹理后还保留原图的问题。

  3. 修复 Box2D 在 Contract 回调函数内销毁节点会崩溃的问题。

  4. 修复热更新文件很多时,会造成UI页面卡主的问题。

  5. Prefab 中会记录无用的 Mesh 数据。

  6. iOS ETC 压缩格式,使用 Mac 压缩后透明度不对。

  7. 自动合图的纹理填充率变低,导致 UI Drawcall 增加。

六、v3.8.6 预告

03bfbbe35cd4c33c5d1a044f572e2961.png

Cocos Creator v3.8.6 版本的迭代将继续聚焦于优化包体大小和加载速度,增强对 Spine 和 Box2D 的支持,提升编辑器易用性等。

70fae479dd7c248e930064f1faa638f3.png

感谢大家对 Cocos Creator 的支持与信任,让我们一起创造更多优秀的作品!

### 关于 Cocos Creator 3.8.5 中无法添加重复组件 `cc.UIOpacity` 的解决方法 在 Cocos Creator 开发过程中,可能会遇到尝试向同一个节点多次添加相同类型的组件时引发的错误提示:“Can&#39;t add component &#39;cc.UIOpacity&#39; because KK already contains the same component”。这种问题的根本原因在于 Cocos Creator 不允许在同一节点上存在多个相同的组件实例。 以下是针对该问题的具体分析和解决方案: #### 问题根源 当调用 `node.addComponent(UIOpacity)` 方法时,Cocos Creator 会在目标节点上检查是否存在同类型的组件。如果已存在,则会抛出异常并阻止进一步操作。这是因为同一类型组件的功能通常可以覆盖整个节点范围,因此无需重复添加[^1]。 --- #### 解决方案一:调整代码逻辑顺序 类似于引用中的案例,可以通过重新安排代码执行顺序来规避冲突。例如,确保不会在已有 `UIOpacity` 组件的情况下再次尝试添加它。以下是一个修正后的代码示例: ```javascript const node = new Node(&#39;box&#39;); this.node.addChild(node); // 检查是否已经有 UIOpacity 组件 if (!node.getComponent(cc.UIOpacity)) { const uiOpacity = node.addComponent(cc.UIOpacity); uiOpacity.opacity = 128; // 设置透明度值 } // 添加其他必要组件 const sprite = node.addComponent(cc.Sprite); sprite.sizeMode = cc.Sprite.SizeMode.CUSTOM; ``` 此代码片段中加入了对现有组件的检测机制,从而避免了重复添加的操作[^1]。 --- #### 解决方案二:移除旧有组件后再添加新组件 如果确实需要替换现有的某个组件(如 `UIOpacity`),可以在添加之前先将其从节点中删除。具体实现方式如下所示: ```javascript const node = new Node(&#39;box&#39;); this.node.addChild(node); // 如果存在旧版 UIOpacity,则先行销毁 const oldUIOpacity = node.getComponent(cc.UIOpacity); if (oldUIOpacity) { node.removeComponent(oldUIOpacity); } // 创建新的 UIOpacity 并设置属性 const newUIOpacity = node.addComponent(cc.UIOpacity); newUIOpacity.opacity = 128; // 同样处理其他组件... const sprite = node.addComponent(cc.Sprite); sprite.sizeMode = cc.Sprite.SizeMode.CUSTOM; ``` 这种方法适用于那些希望完全控制组件生命周期的情况[^2]。 --- #### 解决方案三:利用脚本管理复杂逻辑 对于复杂的场景,建议编写专门用于初始化或新节点状态的工具函数或者类库文件。这样不仅能够提高可维护性和扩展性,还能有效减少潜在错误的发生概率。下面给出一个简单的例子作为参考: ```typescript class ComponentManager { static ensureUniqueComponent<T extends cc.Component>(targetNode: cc.Node, ctor: typeof T): T | null { let existingComp = targetNode.getComponent(ctor); if (!existingComp) { return targetNode.addComponent(ctor); } return existingComp as T || null; } static applySettingsToUIOpacity(targetNode: cc.Node, opacityValue?: number): void { const comp = this.ensureUniqueComponent<cc.UIOpacity>(targetNode, cc.UIOpacity); if (comp && typeof opacityValue === "number") { comp.opacity = Math.max(Math.min(opacityValue, 255), 0); // 防止越界 } } } ``` 随后即可方便地调用这些封装好的功能完成任务: ```javascript const boxNode = new Node(&#39;box&#39;); this.node.addChild(boxNode); // 应用默认配置 ComponentManager.applySettingsToUIOpacity(boxNode, 192); // 追加更多组件定义 const sp = boxNode.addComponent(cc.Sprite); sp.sizeMode = cc.Sprite.SizeMode.CUSTOM; ``` 这种方式特别适合大型项目开发阶段采用[^3]。 --- #### 总结 综上所述,面对 “Can&#39;t add component &#39;cc.UIOpacity&#39;...” 类型的问题,开发者可以根据实际需求选择合适的策略加以应对——无论是简单修改原有流程还是构建加完善的管理体系都可以很好地解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值