当前位置: 首页 > news >正文

cocosCreator 之 Bundle使用

版本: v3.4.0

语言: TypeScript

环境: Mac

Bundle简介


全名 Asset Bundle(简称AB包),自cocosCreator v2.4开始支持,用于作为资源模块化工具。

允许开发者根据项目需求将贴图、脚本、场景等资源划分在 Bundle 中,用于减少启动时需要加载的资源数量, 从而降低首次下载或加载游戏时所需要的时间。

我们知道针对于动态加载的资源,我们会将其放到 resources 目录中。但cocosCreator启动时,会默认加载 resources下的所有资源,这样可能会导致启动时间过长。如果将 resources目录中的一部分资源放到自定义的 Bundle 中,在需要的时候再进行加载,这样游戏启动就更快。

另外,在很多的项目中可能会集成着各种不同类型的小游戏,可以将它们设置为不同的 Bundle,点击某个入口按钮,先下载,然后加载显示,不需要的时候再销毁掉。这样能够灵活的对资源进行管理。

Asset Bundle 是一个很强大的资源模块化工具,它可以根据需求进行随意放置:

  • 本地
  • 远程服务器
  • 小游戏平台分包
  • 跨项目复用

使用 Asset Bunlde 可以更灵活的加载,管理、共享资源甚至进行压缩和加密,提升游戏的性能和安全。

本篇文章会介绍下:

  • 内置Bundle,及AssetManager下的主要接口
  • 自定义Bundle的创建、优先级、结构配置等
  • 自定义Bundle在本地的使用
  • 其他

如有编写或理解不当,感谢您的指出!


内置Bundle

在之前的博客: cocosCreator 之 resources动态加载和预加载 中曾说过 resources 也是Bundle,它是内置Bundle之一。cocosCreator主要的内置Bundle有:

名称说明配置
resources存放在resources目录下的所有资源及依赖资源资源管理器的assets目录下增加resources文件夹即可
main存放所有在 构建发布 面板的 参与构建场景 中勾选的场景以及其依赖资源通过配置 构建发布 面板的 主包压缩类型配置主包为远程包 两项
start-scene如果在 构建发布 面板中勾选了 初始场景分包,则首场景将会被构建到 start-scene无法配置

cc.d.ts的定义文件下也可以看到:

export namespace AssetManager {// 内置bundle名称export enum BuiltinBundleName {RESOURCES = "resources",MAIN = "main",START_SCENE = "start-scene"}
}

AssetManager, 可以将它理解为加载、释放Bundle的管理类。


自定义Bundle


自定义的Bundle是以文件夹的形式存在的,且不支持 嵌套。Bundle的命名不要使用内置Bundle名称,也就是resources, main, start-scene等。

在资源管理器的assets目录下新增文件夹后,命名比如为:“asset-bundle”, 选中该文件夹,查看 属性检查器
请添加图片描述

勾选配置为Bundle,如图所示:
请添加图片描述

主要参数有:

配置参数说明
Bundle名称默认使用创建文件夹的名字,可根据需要修改
Bundle优先级从大到小 的顺序对Bundle进行加载,主要是为了 避免资源依赖或者资源重复等问题
目标平台不同的平台可使用不同的配置,构建时会根据平台配置来构建Bundle
压缩类型决定Bundle的最后输出方式,包括 合并依赖无压缩合并所有 JSON小游戏分包Zip 5 种压缩类型
配置为远程包不支持web平台,勾选以后,Bundle会被放到 remote文件夹

Bundle优先级

项目中可能存在着很多的Bundle, 容易出现资源A在BundleA中,但被BundleB或C依赖的情况。内置的Bundle的层级默认为:

内置Bundle层级
main7
resources8
start-scane20

如果自定义了Bundle,优先级设置尽量不要高于自定义的Bundle,且注意优先级的加载从大到小

不同Bundle之间的脚本尽量也减少依赖关系,这样以后方便Bundle跨项目复用等。


压缩类型

压缩类型不仅在自定义Bundle中使用,也在构建发布的主包压缩类型中也会使用。

  • 无压缩 没有任何压缩操作, 会保留原始的文件大小和格式。这种方式能够保留资源的最佳质量,但包体会增大
  • 合并依赖 将相互依赖的资源的 JSON 文件合并在一起,从而减少运行时的加载请求次数
  • 合并所有JSON 将所有资源的 JSON 文件合并为一个,从而最大化减少请求数量。 原生平台不推荐使用,会增加热更新的包体大小
  • 小游戏分包 主要针对于提供了分包功能的小游戏平台,设置该类型后, 配置为远程包 选项不可勾选。
  • ZIP 在部分小游戏平台,构建 Bundle 时会将资源文件压缩成一个 Zip 文件,从而降低网络请求。如果放在本地,则没有必要使用,与 配置为远程包配合使用。

Bundle构建


在上文中我们构建了一个asset-bundle, 在里面添加点场景,资源,脚本什么的。
请添加图片描述

然后通过构建发布, 主包压缩类型选择: 合并依赖, 分别构建:Android和微信小游戏包。如下图所示:
请添加图片描述
请添加图片描述

包括内置Bundle在内,他们的目录结构是类似的, 主要包括 代码资源 部分。

  • 代码 文件夹中的所有代码会根据发布平台合并成一个 index.jsgame.js 的入口脚本文件
  • 资源 文件夹中的所有资源以及文件夹外的相关依赖资源都会放到 importnative 目录下
  • 资源配置 所有资源的配置信息包括路径、类型、版本信息都会被合并成一个 config.json 文件

简要看下index.js 的代码:

// ...
(function(r) {r('virtual:///prerequisite-imports/asset-bundle', 'chunks:///_virtual/asset-bundle'); 
})(function(mid, cid) {System.register(mid, [cid], function (_export, _context) {return {setters: [function(_m) {var _exportObj = {};for (var _key in _m) {if (_key !== "default" && _key !== "__esModule") _exportObj[_key] = _m[_key];}_export(_exportObj);}],execute: function () { }};});
});

脚本加载Bundle


自定义的 Bundle 在脚本中的使用,与resources的使用时类似的。但调用,需要依靠 cc.assetManager进行调用。

export const assetManager: AssetManager;

AssetManager 模块是用来管理、加载、释放的资源管理类。针对于 Bundle,它的主要方法有:

export class AssetManager {// 获取已加载的bundle缓存bundles: __private.cocos_core_asset_manager_cache_ICache<AssetManager.Bundle>;// 获取内置main包get main(): AssetManager.Bundle | null;// 获取内置resources包get resources(): AssetManager.Bundle | null;// 获取已加载的分包getBundle(name: string): AssetManager.Bundle | null;// 移除包,包内的资源不会自动释放removeBundle(bundle: AssetManager.Bundle): void;// 加载包loadBundle(name, options, onComplete);
}

关于Bundle的主要方法,曾在 cocosCreator 之 resources动态加载和预加载 说明过,这里简要罗列下:

名字描述
namebundle的名称
basebundle的根路径
getInfoWithPath(path, type)通过路径获取指定资源的配置信息
getDirWithPath(path, type, out)获取某个指定文件夹下的所有资源信息
getAssetInfo(uuid)通过uuid获取资源信息
getSceneInfo(name)通过场景名获取场景信息
load(path, type, onPrgress, onComplete)通过相对路径加载资源
loadDir(dir, type, onProgree, onComplete)加载目标文件夹中的所有资源
loadScene(name, optins, onProgress, onComplete)通过场景名称加载分包中的场景
preload(paths,type, onProgress, onComplete)通过相对路径预加载分包中的资源
preloadDir(dir, type, onProgress, onComplete)预加载目标文件夹中的所有资源
preloadScene(name, optins, onProgress, onComplete)通过场景名称预加载分包中的场景
releaseUnusedAssets()释放此包中的所有没有用到的资源
releaseAll()释放此包中的所有资源

方法虽然类似,但使用Bundle 需要注意,先加载,才能使用。接口是:assetManager.loadBundle

// 加载Bundle
assetManager.loadBundle("asset_bundle", (err, bundle) => {if (err) {return console.error(err.message);}this.tipLabel.string = `加载的Bundle:${bundle.name} 成功`;
});

如果不太确定Bundle是否已加载,可通过assetManager.getBundle进行检测获取

// 获取已加载的Bundle
let bundle = assetManager.getBundle(BUNDLE_NAME);
if (bundle) {return;
}
// ...

跟踪如下:

内置的Bundle比如main、resources已经被加载了。

请添加图片描述

在加载Bundle成功后,就可以调用Bundle内部的图片,预制体页面、场景等。

let bundle = assetManager.getBundle(BUNDLE_NAME);
if (!bundle) {this.tipLabel.string = "操作失败,请先点击加载Bundle";return;
}// 加载预制体页面
bundle.load("testLayer", Prefab, (err, prefab) => {if (err) {return console.error(err.message);}let layerNode = instantiate(prefab);layerNode.parent = this.node;
});// 加载纹理
bundle.load("icon/texture", Texture2D, (err, texture) => {if (err) {return console.error(err.message);}let node = new Node("sprite");node.layer = Layers.Enum.UI_2D;node.setPosition(0, 0, 0);node.scale = v3(0.5, 0.5, 0.5);let sprite = node.addComponent(Sprite);const spriteFrame = new SpriteFrame();spriteFrame.texture = texture;sprite.spriteFrame = spriteFrame;node.parent = this.tipLabel.node.parent;
});// 加载场景
bundle.loadScene("subScene", (err, scene) => {if (err) {return console.error(err.message);}director.runScene(scene);
});

如果Bundle不想使用了,可以从管理器中进行移除

let bundle = assetManager.getBundle(BUNDLE_NAME);
if (!bundle) {return;
}// 移除Bundle, 移除并不会释放资源
// 如果再想使用,比如调用loadBundle
assetManager.removeBundle(bundle);

注意: Bundle释放后,如果想在使用,比如loadBundle

后续待补充…

相关文章:

cocosCreator 之 Bundle使用

版本&#xff1a; v3.4.0 语言&#xff1a; TypeScript 环境&#xff1a; Mac Bundle简介 全名 Asset Bundle(简称AB包)&#xff0c;自cocosCreator v2.4开始支持&#xff0c;用于作为资源模块化工具。 允许开发者根据项目需求将贴图、脚本、场景等资源划分在 Bundle 中&am…...

分类网络搭建示例

搭建CNN网络 本章我们来学习一下如何搭建网络&#xff0c;初始化方法&#xff0c;模型的保存&#xff0c;预训练模型的加载方法。本专栏需要搭建的是对分类性能的测试&#xff0c;所以这里我们只以VGG为例。 请注意&#xff0c;这里定义的只是一个简陋的版本&#xff0c;后续一…...

为 Ubuntu 虚拟机构建 SSH 服务器

以校园网环境和VMware为例&#xff0c;关键步骤如下&#xff1a; 安装 SSH 服务&#xff1a; 打开 Ubuntu 虚拟机。打开终端。输入命令 sudo apt-get update 更新软件包列表。输入命令 sudo apt-get install openssh-server 安装 SSH 服务。 配置 SSH 服务&#xff1a; 编辑配…...

SpringBoot--中间件技术-2:整合redis,redis实战小案例,springboot cache,cache简化redis的实现,含代码

SpringBoot整合Redis 实现步骤 导pom文件坐标 <!--redis依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>yaml主配置文件&#xff0c;配置…...

linux rsyslog配置文件详解

1.rsyslog配置文件简介 linux rsyslog配置文件/etc/rsyslog.conf分为三部分:MODULES、GLOBAL DIRECTIVES、RULES ryslog模块说明 模块说明MODULES指定接收日志的协议和端口。若要配置日志服务器,则需要将相应的配置项注释去掉。GLOBAL DIRECTIVES主要用来配置日志模版。指定…...

wordpress是什么?快速搭网站经验分享

​作者主页 &#x1f4da;lovewold少个r博客主页 ⚠️本文重点&#xff1a;c入门第一个程序和基本知识讲解 &#x1f449;【C-C入门系列专栏】&#xff1a;博客文章专栏传送门 &#x1f604;每日一言&#xff1a;宁静是一片强大而治愈的神奇海洋&#xff01; 目录 前言 wordp…...

排序 算法(第4版)

本博客参考算法&#xff08;第4版&#xff09;&#xff1a;算法&#xff08;第4版&#xff09; - LeetBook - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 本文用Java实现相关算法。 我们关注的主要对象是重新排列数组元素的算法&#xff0c;其中每个元素…...

asp.net 在线音乐网站系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 在线音乐网站系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言 开发 asp.net 在线音乐网站系统1 应用…...

ElastaticSearch -- es之Filters aggregation 先过滤再聚合

使用场景 使用es时&#xff0c;有时我们需要先过滤后再聚合&#xff0c;但如果直接在query的filter中过滤&#xff0c;不止会影响到一个聚合&#xff0c;还会影响到其他的聚合结果。 比如&#xff0c;我们想要统计深圳市某个品牌的总销售额&#xff0c;以及该品牌的女款衣服的…...

如何把一个接口设计好?

如何把一个接口设计好&#xff1f; 如何设计一个接口&#xff1f;是在我们日常开发或者面试时经常问及的一个话题。很多人觉得这不就是CRUD&#xff0c;能实现不就行了。单纯实现来说&#xff0c;并非难事&#xff0c;但要做到易用、易扩展、易维护并不是一件简单的事。这里并…...

mini-vue 的设计

mini-vue 的设计 mini-vue 使用流程与结果预览&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name&qu…...

React整理杂记(一)

1.React三项依赖 1.react.js -> 核心代码 2.react-dom.js -> 渲染成dom 3.babel.js->非必须&#xff0c;将jsx转为js 类组件中直接定义的方法&#xff0c;都属于严格模式下 this的绑定可以放到constructor(){}中 2. JSX语法 1.可以直接插入的元素&#xff1a; num…...

[100天算法】-统计封闭岛屿的数目(day 74)

题目描述 有一个二维矩阵 grid &#xff0c;每个位置要么是陆地&#xff08;记号为 0 &#xff09;要么是水域&#xff08;记号为 1 &#xff09;。我们从一块陆地出发&#xff0c;每次可以往上下左右 4 个方向相邻区域走&#xff0c;能走到的所有陆地区域&#xff0c;我们将其…...

esp32-rust-std-examples-blinky

以下为在 ESP-IDF (FreeRTOS) 上运行的 blinky 示例&#xff1a; https://github.com/esp-rs/esp-idf-hal/blob/master/examples/blinky.rs //! Blinks an LED //! //! This assumes that a LED is connected to GPIO4. //! Depending on your target and the board you are …...

【docker容器技术与K8s】

【docker容器技术与K8s】 一、Docker容器技术 1、Docker的学习路线 &#xff08;1&#xff09;学习Docker基本命令&#xff08;容器管理和镜像管理&#xff09; &#xff08;2&#xff09;学习使用Docker搭建常用软件 &#xff08;3&#xff09;学习Docker网络模式 启动容器的…...

RT-DTER 引入用于低分辨率图像和小物体的新 CNN 模块 SPD-Conv

论文地址:https://arxiv.org/pdf/2208.03641v1.pdf 代码地址:https://github.com/labsaint/spd-conv 卷积神经网络(CNN)在图像分类、目标检测等计算机视觉任务中取得了巨大的成功。然而,在图像分辨率较低或对象较小的更困难的任务中,它们的性能会迅速下降。 这源于现有CNN…...

Folw + Room 实现自动观察数据库的刷新

1、Room &#xff1a;定义数据结构、创建数据库 // 定义实体 Entity data class TestModel ()// 定义数据库 Dao interface TestDao { Query("SELECT * FROM TestTable") fun getAll(): List<TestModel> }// 获取数据库 abstract class TestDatabase: RoomDat…...

黑马程序员微服务Docker实用篇

Docker实用篇 0.学习目标 1.初识Docker 1.1.什么是Docker 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署…...

虚拟化服务器+华为防火墙+kiwi_syslog访问留痕

一、适用场景 1、大中型企业需要对接入用户的访问进行记录时&#xff0c;以前用3CDaemon时&#xff0c;只能用于小型网络当中&#xff0c;记录的数据量太大时&#xff0c;本例采用破解版的kiwi_syslog。 2、当网监、公安查到有非法访问时&#xff0c;可提供基于五元组的外网访…...

FlinkSQL聚合函数(Aggregate Function)详解

使用场景&#xff1a; 聚合函数即 UDAF&#xff0c;常⽤于进多条数据&#xff0c;出⼀条数据的场景。 上图展示了⼀个 聚合函数的例⼦ 以及 聚合函数包含的重要⽅法。 案例场景&#xff1a; 关于饮料的表&#xff0c;有三个字段&#xff0c;分别是 id、name、price&#xff0…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...