CocosCreator3.8研究笔记(十五)CocosCreator 资源管理Asset Bundle

news2025/1/17 15:21:51

在资源管理模块中有一个很重要的功能: Asset Bundle,那什么是Asset Bundle ?有什么作用?怎么使用 Asset Bundle呢 ?

一、什么是Asset Bundle ?有什么作用?


在日常游戏开发过程中,为了减少游戏启动时,资源首次下载和加载的时间,我们可以只下载和加载需要的资源模块。


而CocosCreator 中的 Asset Bundle 就是这样的模块化工具,允许我们按照项目需求,将图片、脚本、场景 等资源划分


在多个不同的 Asset Bundle 中。

例如:一个大厅中集成了很多小游戏,我们都可以把 大厅以及不同的小游戏分别划分成不同的 Asset Bundle来管理。


Asset Bundle 可以放在不同的地方,比如远程服务器上,本地、或者小游戏平台的分包里。


二、CocosCreator 内置 Asset Bundle

内置 Asset Bundle功能说明配置优先级
main存放所有在 构建发布 面板的 参与构建场景 中勾选的场景以及其依赖资源通过配置 构建发布 面板的 主包压缩类型配置主包为远程包 两项7
resources存放 resources 目录下的所有资源以及其依赖资源通过配置 资源管理器 中的 assets -> resources 文件夹8
start-scene如果在 构建发布 面板中勾选了 初始场景分包,则首场景将会被构建到 start-scene 中。无法进行配置20
internal引擎模块内置的一些默认资源无法进行配置21

**三、Asset Bundle 的基本使用 **


1、Asset Bundle 配置


自定义 Asset Bundle 以 文件夹 为单位进行配置,可以点击 属性检查器 上的 编辑按钮 或者通过 项目 菜单打开 项目设置 对 Bundle 进行配置。


在这里插入图片描述


在这里插入图片描述


配置项说明

配置项功能说明
Bundle 名称Asset Bundle 构建后的名称,默认会使用这个文件夹的名字,可根据需要修改。
Bundle 优先级Creator 开放了 20 个可供配置的优先级,构建时将会按照优先级 从大到小 的顺序对 Asset Bundle 依次进行构建。
目标平台不同平台可使用不同的配置,构建时将根据对应平台的设置来构建 Asset Bundle。支持通过下拉框选择不同的平台配置,目前为默认配置。开发者可以通过 项目设置 -> Bundle 配置 自定义自己的配置方案。
压缩类型决定 Asset Bundle 最后的输出形式,包括 合并依赖无压缩合并所有 JSON小游戏分包Zip 5 种压缩类型。
配置为远程包是否将 Asset Bundle 配置为远程包,不支持 Web 平台。 若勾选了该项,则 Asset Bundle 在构建后会被放到 remote 文件夹,你需要将整个 remote 文件夹放到远程服务器上。 构建 OPPO、vivo、华为等小游戏平台时,若勾选了该项,则不会将 Asset Bundle 打包到 rpk 中。
Bundle 资源过滤资源过滤可以过滤掉 Bundle 内的某些资源,通过下方的 预览 按钮,可以查看 Bundle 最终会的资源列表,Bundle 过滤分为包含和排除两部分。
构建 Bundle构建 Bundle 可以针对当前选中的 Bundle 进行构建。

(1)、Bundle 优先级规则说明

  • 当同个资源被 不同优先级 的多个 Asset Bundle 引用时,资源会优先放在优先级高的 Asset Bundle 中,低优先级的 Asset Bundle 只会存储一条记录信息。此时低优先级的 Asset Bundle 会依赖高优先级的 Asset Bundle。


    如果想在低优先级的 Asset Bundle 中加载此共享资源,必须在加载低优先级的 Asset Bundle 之前 先加载高优先级的 Asset Bundle。


  • 当同个资源被 相同优先级 的多个 Asset Bundle 引用时,资源会在每个 Asset Bundle 中都复制一份。此时不同的 Asset Bundle 之间没有依赖关系,可按任意顺序加载。


    所以需尽量确保共享的资源(例如 TextureSpriteFrameAudio 等)所在的 Asset Bundle 优先级更高,以便让更多低优先级的 Asset Bundle 共享资源,从而最小化包体。


  • 自定义的 Asset Bundle 优先级 不要高于 内置的 Asset Bundle,以便尽可能共享内置 Asset Bundle 中的资源。


(2)、压缩类型说明

Asset Bundle 默认使用 合并依赖 压缩类型,开可重新设置包括内置 Asset Bundle 在内的所有 Asset Bundle 的压缩类型。


压缩类型功能说明
合并依赖构建 Asset Bundle 时会将相互依赖的资源的 JSON 文件合并在一起,从而减少运行时的加载请求次数
无压缩构建 Asset Bundle 时没有任何压缩操作
合并所有 JSON构建 Asset Bundle 时会将所有资源的 JSON 文件合并为一个,从而最大化减少请求数量,但可能会增加单个资源的加载时间
小游戏分包在提供了分包功能的小游戏平台,会将 Asset Bundle 设置为对应平台上的分包。
Zip在部分小游戏平台,构建 Asset Bundle 时会将资源文件压缩成一个 Zip 文件,从而减少运行时的加载请求数量

(3)、Bundle 资源过滤

资源过滤可以将选中的 Bundle 内的某些资源包括或者排除在 Bundle 内。


过滤类型

过滤类型目前有两种,Asset 资源以及 URL。默认为 URL


2、Asset Bundle 的构建


在构建时,配置为 Asset Bundle 的文件夹中的资源(包含场景、代码和其他资源)以及文件夹外的相关依赖资源都会被合并到同一个 Asset Bundle 文件夹中。


配置为 Asset Bundle 的文件夹中的所有 代码资源,会进行以下处理:

  • 代码:文件夹中的所有代码会根据发布平台合并成一个 index.jsgame.js 的入口脚本文件。

  • 资源:文件夹中的所有资源以及文件夹外的相关依赖资源都会放到 importnative 目录下。

  • 资源配置:所有资源的配置信息包括路径、类型、版本信息都会被合并成一个 config.json 文件。


例如:

在这里插入图片描述


3、 Asset Bundle 加载


(1)、通过名称加载

CocosCreator 提供了一个统一的 API assetManager.loadBundle 来加载 Asset Bundle,加载时需要传入 Asset Bundle 配置面板中的 Bundle 名称或者 Asset Bundle 的 url

assetManager.loadBundle('name', (err, bundle) => {
    bundle.load('xxx');
});


(2)、通过url加载

复用其他项目的 Asset Bundle 时,只能通过 url 进行加载:

assetManager.loadBundle('https://test.com/remote/name', (err, bundle) => {
    bundle.load('xxx');
});

(3)、通过户空间路径加载

assetManager.loadBundle 还支持传入用户空间中的路径来加载 Asset Bundle。

我们可以通过对应平台提供的下载接口将 Asset Bundle 提前下载到用户空间中,然后再使用 loadBundle 进行加载,这样就可以完全自己管理 Asset Bundle 的下载与缓存过程,使用更灵活。


// 原生平台
assetManager.loadBundle(jsb.fileUtils.getWritablePath() + '/path/bundleName', (err, bundle) => {
    // ...
});

// 微信小游戏平台
assetManager.loadBundle(wx.env.USER_DATA_PATH + '/path/bundleName', (err, bundle) => {
    // ...
});


4、加载 Asset Bundle 中的资源


(1)、普通加载

Asset Bundle 加载完成后,会返回一个 AssetManager.Bundle 类的实例。

我们可以通过实例上的 load 方法来加载 Asset Bundle 中的资源,此方法的参数与 resources.load 相同,只需要传入资源相对 Asset Bundle 的路径即可。

需要注意:路径的结尾处 不能 包含文件扩展名。

// 加载 Texture
bundle.load(`image/texture`, Texture2D, function (err, texture) {
    console.log(texture)
});

(2)、批量加载资源

批量加载资源与 resources.loadDir 相似,只需要传入该目录相对 Asset Bundle 的路径即可。

bundle.loadDir("textures", function (err, assets) {
    // ...
});

(3)、加载场景

加载场景 Asset Bundle 提供了 loadScene 方法用于加载指定 bundle 中的场景,你只需要传入 场景名 即可。
loadScenedirector.loadScene 不同的地方在于 loadScene 只会加载指定 bundle 中的场景,而不会运行场景,还需要使用 director.runScene 来运行场景:

bundle.loadScene('test', function (err, scene) {
    director.runScene(scene);
});

(4)、预加载资源

Asset Bundle 中提供了 preloadpreloadDir 接口用于预加载 Asset Bundle 中的资源。具体的使用方式和 assetManager 一致。


5、获取 Asset Bundle

当 Asset Bundle 被加载过之后,会被缓存下来,可以使用 Asset Bundle 名称来获取该 bundle。例如:

let bundle = assetManager.getBundle('name');

6、释放 Asset Bundle 中的资源

可以通过以下三种方式进行释放:

  • 使用常规的 assetManager.releaseAsset 方法进行释放。
 bundle.load(`image/spriteFrame`, SpriteFrame, function (err, spriteFrame) {
     assetManager.releaseAsset(spriteFrame);
 });

  • 使用 Asset Bundle 提供的 release 方法,通过传入路径和类型进行释放,只能释放在 Asset Bundle 中的单个资源。参数可以与 Asset Bundle 的 load 方法中使用的参数一致。

 bundle.load(`image/spriteFrame`, SpriteFrame, function (err, spriteFrame) {
     bundle.release(`image`, SpriteFrame);
 });

  • 使用 Asset Bundle 提供的 releaseAll 方法,此方法与 assetManager.releaseAll 相似,releaseAll 方法会释放所有属于该 bundle 的资源(包括在 Asset Bundle 中的资源以及其外部的相关依赖资源),请慎重使用。

 bundle.load(`image/spriteFrame`, SpriteFrame, function (err, spriteFrame) {
     bundle.releaseAll();
 });

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

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

相关文章

基于Android 语音朗读书籍管理系统

视频演示: 基于Android 语音朗读书籍管理系统 基于 Android 的语音朗读书籍管理系统可以提供用户管理书籍、朗读书籍的功能。以下是一个简单的步骤和功能列表: 用户注册和登录功能: 用户可以注册新账号或使用现有账号登录系统。用户信息可以包…

Redis从入门到精通(四:持久化)

持久化简介 什么是持久化 利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化 持久化用于防止数据的意外丢失,确保数据安全性 为什么持久化 redis是将数据存储在内存上的,一旦断电,或者因…

嵌入式学习笔记(23)通信的基础概念

5.1.1通信的发展历史 (1)烽火台、狼烟;信件;电子通信(电报、电话、网络信号) (2)通信中最重要的两个方面:信息表示、解析方法 信息的传输方法 (3&#xf…

04-前端基础CSS第二天

01-CSS第二天导读 目标: 能使用emmet语法能够使用CSS复合选择器能够写出伪类选择器的使用规范能够说出元素有几种显示模式能够写出元素显示模式的相互转换代码能够写出背景图片的设置方式能够计算CSS的权重 目录: Emmet语法CSS的复合选择器CSS的元素…

[.NET 6] IHostedService 的呼叫等等我的爱——等待Web应用准备就绪

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不是技术而是人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔 !序言 在这篇文章中,我将介绍如何等…

搜狐验证码

嗯。。。。我又来了。百度这段时间老搞事情,做seo的兄弟们该何去何从。准备转战sh,xl,谷歌了。 先来看看搜狐两种验证类型。 滑块: 点选: 目前好像就只有这两种类型。感兴趣的可以去看看这个。不难。作者踩坑的地方。加密少了个…

【LeetCode-简单题】27. 移除元素

文章目录 题目方法一:快慢指针 题目 方法一:快慢指针 int fast 0;// 快指针 用于扫描需要的元素int slow 0;//慢指针 用于记录需要存放元素的位置class Solution { // 快慢指针public int removeElement(int[] nums, int val) {int fast 0;// 快指针…

Kubernetes Dashboard安装部署

Kubernetes Dashboard安装部署 1. 下载Dashboard 部署文件2. 修改yaml配置文件3. 应用安装,查看pod和svc4. 创建dashboard服务账户5. 创建admin-user用户的登录密钥6. 登录6.1 使用token登录(1) 短期token(2) token长期有效 6.2 使用 Kubeconfig 文件登录 7.安装met…

Linux内核4.14版本——drm框架分析(12)——DRM_IOCTL_MODE_SETCRTC(drm_mode_setcrtc)

目录 1. drm_mode_setcrtc 1.1 根据应用传入的crtc_id找到crtc 1.2 根据应用传入的fb_id,找到对应的drm_framebuffer 1.3 根据应用传入的mode,创建一个drm_display_mode 1.4 根据传入的set_connectors_ptr,找到驱动对应的connector 1.5 将以上信息…

【题解】2596. 检查骑士巡视方案

题解&#xff1a; class Solution {int n,m;bool st[100][100];int flag;int dx[8]{-1,-2,-2,-1,1,2,2,1};int dy[8]{-2,-1,1,2,2,1,-1,-2}; public:bool checkValidGrid(vector<vector<int>>& grid) {m grid.size();n grid[0].size();dfs(grid,0,0,0);ret…

第二章 进程与线程 三、进程控制

目录 一、定义 二、实现方式&#xff08;用原语实现&#xff09; 注意&#xff1a; 1、原语是什么 2、如何实现原语的原子性 3、关中断指令和开中断指令是什么 三、进程控制的相关原语 1、进程的创建 ​编辑 2、进程的终止 3、进程的阻塞与唤醒&#xff08;阻塞和唤醒…

明星翻包视频的流行:背后的动机和原因

现如今&#xff0c;明星翻包视频正风靡社交媒体&#xff0c;引发了广泛的关注和讨论。这种趋势引发了一个问题&#xff1a;为什么现在的明星都喜欢翻包呢&#xff1f;要理解这一现象&#xff0c;我们需要深入探讨背后的动机和原因。在社交媒体的兴起和品牌合作的崭露头角的背景…

.360勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复

导言&#xff1a; 在当今数字时代&#xff0c;随着我们对计算机和互联网的依赖不断增加&#xff0c;威胁网络安全的因素也日益猖獗。其中&#xff0c; 360 勒索病毒是一股咄咄逼人的黑暗力量&#xff0c;它能够迅速加密您的数据文件&#xff0c;并以比特币等加密货币的形式勒索…

加密资产托管:迈向安全与合规的未来!

在当今数字化时代&#xff0c;加密货币正逐渐走进人们的视野&#xff0c;并成为越来越多投资者和机构的关注焦点。然而&#xff0c;加密领域仍存在一个主要问题&#xff1a;如果丢失了密钥&#xff0c;就会导致无法访问资产。为了解决这一问题&#xff0c;加密货币行业正在向资…

在Visual Studio Code中安装JetBrains Mono字体

让我们面对现实吧&#xff0c;JetBrain的Mono是一种漂亮的单行线字体&#xff0c;对于在IDE中展示代码和处理代码都很有用。它有一个增加的X高度&#xff0c;以获得更好的阅读体验&#xff0c;有更好的形状以看到字母列&#xff0c;还有一个开发者友好的各种连接词&#xff0c;…

【深度学习】对比学习

1.什么是对比学习 对比学习有的paper中称之为自监督学习&#xff0c;有的paper称之为无监督学习&#xff0c;自监督学习是无监督学习的一种形式&#xff0c;现有的文献中没有正式的对两者进行区分定义&#xff0c;这两种称呼都可以用。其主要思想是模型能够更加重新的学习到编码…

IIC总线上拉电阻计算

IIC总线上拉电阻计算 1. 概述2. 上拉电阻计算3. 总线传输速度与功率4. 实例计算 1. 概述 IIC&#xff08;Inter-Integrated Circuit&#xff09;其实是IICBus简称&#xff0c;所以中文应该叫集成电路总线&#xff0c;它是一种串行通信总线&#xff0c;使用多主从架构&#xff…

嵌入式Linux驱动开发(I2C专题)(三)

无需编写驱动直接访问设备_I2C-Tools介绍 参考资料&#xff1a; Linux驱动程序: drivers/i2c/i2c-dev.cI2C-Tools-4.2: https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/AP3216C&#xff1a; git clone https://e.coding.net/weidongshan/01_all_series_quick…

没出息的项目经理的5大表现

大家好&#xff0c;我是老原。 都说&#xff0c;30岁的项目经理凶猛如狼&#xff0c;40岁的项目经理狡猾如狐。 实际上&#xff0c;又有多少项目经理能做到这般。 有多少项目经理&#xff0c;兢兢业业工作个几年&#xff0c;最后还是守着一亩三分地&#xff0c;既没有升职加…

JSON注解和异常处理的使用

一、JSON数据返回 1.1.前言 JSON是一种轻量级的数据交换格式&#xff0c;易于阅读和编写&#xff0c;同时也易于机器解析和生成。JSON的常用场景包括&#xff1a; 前后端分离的项目中&#xff0c;后端向前端传送数据时 。 Ajax异步访问数据。RPC远程调用。 除了JSON&#x…