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

后续待补充…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/140191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习基于python+TensorFlow+Django的花朵识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 花朵识别系统&#xff0c;基于Python实现&#xff0c;深度学习卷积神经网络&#xff0c;通过TensorFlow搭建卷积神经…

05-Spring中Bean的生命周期

Bean的生命周期 生命周期就是对象从创建开始到最终销毁的整个过程 , Spring其实就是一个管理Bean对象的工厂,它负责对象的创建和销毁等 Bean生命周期的管理可以参考Spring的源码&#xff1a;AbstractAutowireCapableBeanFactory类的doCreateBean()方法 研究生命周期的意义&am…

【案例】超声波测距系统设计

1.1 总体设计 1.1.1 概述 学习了明德扬至简设计法和明德扬设计规范&#xff0c;本人用FPGA设计了一个测距系统。该系统采用超声波进行测量距离再在数码管上显示。在本案例的设计过程中包括了超声波的驱动、三线式数码管显示等技术。经过逐步改进、调试等一系列工作后&#xf…

Vue中的常用指令v-html / v-show / v-if / v-else / v-on / v-bind / v-for / v-model

前言 持续学习总结输出中&#xff0c;Vue中的常用指令v-html / v-show / v-if / v-else / v-on / v-bind / v-for / v-model 概念&#xff1a;指令&#xff08;Directives&#xff09;是Vue提供的带有 v- 前缀 的特殊标签属性。可以提高操作 DOM 的效率。 vue 中的指令按照不…

Jenkins简介及Docker Compose部署

Jenkins是一个开源的自动化服务器&#xff0c;用于自动化构建、测试和部署软件项目。它提供了丰富的插件生态系统&#xff0c;支持各种编程语言和工具&#xff0c;使得软件开发流程更加高效和可靠。在本文中&#xff0c;我们将介绍Jenkins的基本概念&#xff0c;并展示如何使用…

【操作系统】考研真题攻克与重点知识点剖析 - 第 3 篇:内存管理

前言 本文基础知识部分来自于b站&#xff1a;分享笔记的好人儿的思维导图与王道考研课程&#xff0c;感谢大佬的开源精神&#xff0c;习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析&#xff0c;本人技术…

Leetcode刷题详解—— 有效的数独

1. 题目链接&#xff1a;36. 有效的数独 2. 题目描述&#xff1a; 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的…

sass 封装媒体查询工具

背景 以往写媒体查询可能是这样的&#xff1a; .header {display: flex;width: 100%; }media (width > 320px) and (width < 480px) {.header {height: 50px;} }media (width > 480px) and (width < 768px) {.header {height: 60px;} }media (width > 768px) …

Python实战 | 使用 Python 和 TensorFlow 构建卷积神经网络(CNN)进行人脸识别

专栏集锦&#xff0c;大佬们可以收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https:/…

链表的逆置

方法1&#xff1a; 依次将指针反向&#xff0c;最后令头指针指向尾元素。 逆置过程如下&#xff1a; 当q指针为空时&#xff0c;循环结束。 //试写一算法&#xff0c;对单链表实现就地逆置&#xff0c; void Reverse1(List plist)//太复杂,不用掌握 {assert(plist ! NULL);i…

Spark Job优化

1 Map端优化 1.1 Map端聚合 map-side预聚合&#xff0c;就是在每个节点本地对相同的key进行一次聚合操作&#xff0c;类似于MapReduce中的本地combiner。map-side预聚合之后&#xff0c;每个节点本地就只会有一条相同的key&#xff0c;因为多条相同的key都被聚合起来了。其他节…

基于轻量级卷积神经网络CNN开发构建打架斗殴识别分析系统

在很多公共场合中&#xff0c;因为一些不可控因素导致最终爆发打架斗殴或者大规则冲突事件的案例层出不穷&#xff0c;基于视频监控等技术手段智能自动化地识别出已有或者潜在的危险行为对于维护公共场合的安全稳定有着重要的意义。本文的核心目的就是想要基于CNN模型来尝试开发…

Mathtype公式自动转Word自带公式

Mathtype公式自动转Word自带公式 前言/word技巧探索过程参考资料&#xff08;有效与无效&#xff09;全自动方案/代码/教程 前言/word技巧 word公式 用ALT号可以输入简单latex显示公式&#xff1b;复杂度&#xff0c;需要引入latex包的不行&#xff1b;显示不出来的话按一下en…

CentOS指令学习

目录 一、常用命令 1、ls 2、cd_pwd 3、touch_mkdir_rmdir_rm 4、cp_mv 5、whereis_which_PATH 6、find 7、grep 8、man_help 9、关机与重启 二、压缩解压 1、zip_unzip 2、gzip_gunzip 3、tar 三、其他指令 1、查看用户登录信息 2、磁盘使用情况 3、查看文件…

74HC165 并入串出

/******************************************************** 程序名&#xff1a;main.C 版 本&#xff1a;Ver1.0 芯 片&#xff1a;AT89C51或STC89C51 晶 体&#xff1a;片外12MHz 编 程: Joey 日 期&#xff1a;2023-11-13 描 述&#xff1a;通过 74HC165 对 16 按键…

Radius是什么意思? 安当加密

Radius是什么意思&#xff1f; RADIUS&#xff08;Remote Authentication Dial In User Service&#xff09;是一种远程用户拨号认证系统&#xff0c;它由RFC 2865和RFC 2866定义&#xff0c;是应用最广泛的AAA&#xff08;Authentication、Authorization、Accounting&#xf…

Codeforces Round 788 (Div. 2) E. Hemose on the Tree(树上构造)

题目 t(t<5e4)组样例&#xff0c;每次给定一个数p&#xff0c; 表示一棵节点数为的树&#xff0c; 以下n-1条边&#xff0c;读入树边 对于n个点和n-1条边&#xff0c;每个点需要赋权&#xff0c;每条边需要赋权&#xff0c; 权值需要恰好构成[1,2n-1]的排列 并且当你赋…

《网络协议》04. 应用层(DNS DHCP HTTP)

title: 《网络协议》04. 应用层&#xff08;DNS & DHCP & HTTP&#xff09; date: 2022-09-05 14:28:22 updated: 2023-11-12 06:55:52 categories: 学习记录&#xff1a;网络协议 excerpt: 应用层、DNS、DHCP、HTTP&#xff08;URI & URL&#xff0c;ABNF&#xf…

【数据结构初阶】顺序表SeqList

描述 顺序表我们可以把它想象成在一个表格里面填数据&#xff0c;并对数据做调整&#xff1b; 那我们的第一个问题是&#xff1a;怎么样在创建出足够的空间呢&#xff1f; 我们可以去堆上申请&#xff0c;用一个指针指向一块空间&#xff0c;如果申请的空间不够&#xff0c;我…

Linux 部署Sentinel控制台

Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 1.版本选择 SpringCloudAlibaba SpringClo…