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

2023-11-02


在游戏的开发过程中,需要使用到大量的图片、音频等资源来,从而带来管理上的困难。 Asset Manager 资源管理模块具备加载资源、查找资源、销毁资源、缓存资源、Asset Bundle 等功能,帮助开发者管理其资源的使用。


一、资源的加载


1、动态加载资源


Asset Manager 提供了以下两种的方式:

  • 将资源放在 resources 目录下,配合 resources.load 等 API 来实现动态加载。
  • 将资源制作为 Asset Bundle,再通过 Asset Bundle 的 load 系列 API 进行资源的加载。

(1)、加载预制体

resources.load("test/prefab", Prefab, (err, prefab) => {
    const newNode = instantiate(prefab);
    this.node.addChild(newNode);
});

(2)、 加载 AnimationClip

resources.load("test/anim", AnimationClip, (err, clip) => {s
    this.node.getComponent(Animation).addClip(clip, "anim");
});


(3)、 加载 SpriteFrame

加载SpriteFrame image是ImageAsset spriteFrame
是image/spriteFrame texture是image/texture

resources.load("test/image/spriteFrame", SpriteFrame, (err, spriteFrame) => {
    this.node.getComponent(Sprite).spriteFrame = spriteFrame;
});

(4)、 加载 Texture2D

resources.load("test/image/texture", Texture2D, (err: any, texture: Texture2D) => {
    const spriteFrame = new SpriteFrame();
    spriteFrame.texture = texture;
    this.node.getComponent(Sprite).spriteFrame = spriteFrame;
});

(5)、 加载图集中的 SpriteFrame

resources.load("test/SpriteAtlas", SpriteAtlas, (err, atlas) => {
    const frame = atlas.getSpriteFrame('name');
    sprite.spriteFrame = frame;
});



(6)、 资源批量加载

resources.loadDir 可以加载相同路径下的多个资源:

//加载 test目录下所有资源
resources.loadDir("test", function (err, assets) {
    // ...
});

//加载 test目录下所有 SpriteFrame,并且获取它们的路径
resources.loadDir("test", SpriteFrame, function (err, assets) {
    // ...
});

(7)、加载远程资源

// 远程 url 带图片后缀名
let remoteUrl = "http://test.com/image.png";
assetManager.loadRemote<ImageAsset>(remoteUrl, function (err, imageAsset) {
    const spriteFrame = new SpriteFrame();
    const texture = new Texture2D();
    texture.image = imageAsset;
    spriteFrame.texture = texture;
    // ...
});


// 远程 url 不带图片后缀名,此时必须指定远程图片文件的类型
remoteUrl = "http://test.com/emoji?id=123456";
assetManager.loadRemote<ImageAsset>(remoteUrl, {ext: '.png'}, function (err, imageAsset) {
    const spriteFrame = new SpriteFrame();
    const texture = new Texture2D();
    texture.image = imageAsset;
    spriteFrame.texture = texture;
    // ...
});

// 远程音频
remoteUrl = "http://test.com/sound.mp3";
assetManager.loadRemote(remoteUrl, function (err, audioClip) {
    // play audio 
});

// 远程文本
remoteUrl = "http://unknown.org/skill.txt";
assetManager.loadRemote(remoteUrl, function (err, textAsset) {
    // use string to do something
});

(8)、加载设备资源

用绝对路径加载设备存储内的资源

const absolutePath = "/dara/data/some/path/to/image.png";
assetManager.loadRemote<ImageAsset>(absolutePath, function (err, imageAsset) {
    const spriteFrame = new SpriteFrame();
    const texture = new Texture2D();
    texture.image = imageAsset;
    spriteFrame.texture = texture;
});

(9)、加载Asset Bundle

关于 Asset Bundle 的介绍,资源加载及使用,请查看下一篇文章。


(10)、资源预加载

为了减少下载的延迟,assetManager 和 Asset Bundle 提供了对应的预加载接口。

预加载只会下载必要的资源,不会进行反序列化和初始化工作,性能消耗小,适合在游戏过程中使用。

Asset Manager 中的大部分加载接口包括 loadloadDirloadScene 都有其对应的预加载版本,如下表:

类型 支持 加载 释放 预加载 获取 查询资源信息
单个资源 Asset Bundle load release preload get getInfoWithPath
文件夹 Asset Bundle loadDir releaseAsset preloadDir N/A getDirWithPath
场景 Asset Bundle loadScene N/A preloadScene N/A getSceneInfo
单个资源 resources load release preload get getInfoWithPath
文件夹 resources loadDir releaseAsset preloadDir N/A getDirWithPath
远程 Asset Manager loadRemote releaseAsset N/A N/A N/A

资源加载接口与预加载接口所用参数完全一样,区别在于:

  • 预加载只会下载资源,不会对资源进行解析和初始化操作
  • 预加载在加载过程中会受到更多限制,例如最大下载并发数会更小
  • 预加载的下载优先级更低,当多个资源在等待下载时,预加载的资源会放在最后下载
  • 因为预加载没有做任何解析操作,所以当所有的预加载完成时,不会返回任何可用资源

由于预加载没有解析资源,所以需要在预加载完成后,再配合加载接口进行资源的解析和初始化。

例如:

resources.preload('images/background/spriteFrame', SpriteFrame);

// wait for while 
resources.load('images/background/spriteFrame', SpriteFrame, function (err, spriteFrame) {
    spriteFrame.addRef();
    self.getComponent(Sprite).spriteFrame = spriteFrame;
});

注意:加载不需要等到预加载完成后再调用,开发者可以在任何时候进行加载。

正常加载接口会直接复用预加载过程中已经下载好的内容,缩短加载时间。


二、资源的释放


Asset Manager对依赖资源根据引用数量进行释放。

例如:

resources.load('prefabs/test', Prefab, function (err, asset) {
    assetManager.releaseAsset(asset);
});


Creator 还提供了引用计数机制来控制资源的引用和释放:


  • 当需要持有资源时,调用 addRef 来增加引用,确保该资源不会被其他引用到的地方自动释放。

resources.load('test/texture/image', Texture2D, function (err, texture) {
    texture.addRef();
    this.texture = texture;
});

  • 当不再需要持有该资源时,调用 decRef 来减少引用,decRef 还将根据引用计数尝试自动释放。
this.texture.decRef();
this.texture = null;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CocosCreator3.8研究笔记(十四)CocosCreator 资源管理Asset Manager 的相关文章

随机推荐

  • 微软消息队列-MicroSoft Message Queue(MSMQ)队列的C#使用

    什么是MSMQ Message Queuing MSMQ 是微软开发的消息中间件 可应用于程序内部或程序之间的异步通信 主要的机制是 消息的发送者把自己想要发送的信息放入一个容器中 我们称之为Message 然后把它保存至一个系统公用空间的
  • 大一上期Python考前复习

    初识Python考试前复习 Python介绍 基本语法 1 赋值语句 2 del语句 3 if 语句 4 for循环语句 4 while循环语句 4 1循环下的语句 数据类型 1 数据可变性 2 数据类型 2 1 格式化输出 3 列表 字典
  • 初阶C语言(1)-6200字带你初识C语言

    目录 前言 如何创建一个项目 第一个C语言程序 基本数据类型 变量与常量 字符串与转义字符 选择语句 循环语句 函数 数组 操作符 关键字 常量和宏 指针 结构体 前言 本节旨在初步认识C语言 有的知识在之后会详细讲 C语言是一门面向过程的
  • Java+SSM+Vue 毕业设计 房屋出租出售管理系统(含源码+论文)

    文章目录 1 项目简介 2 实现效果 2 1 界面展示 3 设计方案 3 1 概述 3 2 系统流程 3 2 1 系统开发流程 3 2 2 操作流程 3 3 系统结构设计 4 项目获取 1 项目简介 Hi 各位同学好呀 这里是M学姐 今天向
  • STL之lexicographical_compare

    lexicographical compare and lexicographical compare 3way the latter is not part of the C standard 功能 Returns true if the
  • pip豆瓣源

    豆瓣源地址 https pypi douban com simple 使用方法 pip install 需要的包名 i https pypi douban com simple 豆瓣源也解决了我使用清华源或阿里源的时候Anaconda下载的
  • 字符数组学习

    有关办公中内容读取和写入的 是很常见的 需要通过移位和偏移 计算每次的地址 再累加运算 一种是字符数组 另一种是字符串常量 它们在内存中的存储位置不同 字符数组可以读取和修改 而字符串常量只能读取不能修改 比如这样字符串 NOVO4CCC6
  • 网络5层体系结构中的数据传输过程

    5层网络体系结构 应用层 运输层 网络层 网际层 数据链路层 物理层 物理层 主要任务 考虑怎样才能在连接各种计算的传输媒体上传输数据比特流 数据链路层 mac层 主要任务 在同一个局域网中 分组怎样从一个主机传送到另一个主机 不经过路由器
  • Java 介绍与环境搭建

    文章目录 Java 介绍与环境搭建 Java 背景介绍 Java 背景故事 Java 三大平台 Java SE Java ME Java EE Java 跨平台工作原理 平台与跨平台 跨平台工作原理 JDK 下载和安装 下载 JDK 安装
  • 【imx6ull】视频监控项目(usb摄像头+ffmepeg)

    文章目录 前言 1 总体方案介绍 2 配置v4l2驱动与UVC驱动 3 v4l2应用编程测试摄像头 4 ffmepg移植 总结 前言 参考视频 韦东山老师手把手带你从0开始自己做一个视频监控系统 1 总体方案介绍 这篇文章写的很好 很容易理
  • cmake——project

    命令project用于设置项目的名称 project
  • 关于VISIO工具栏、菜单栏消失的解决办法

    关于VISIO工具栏 菜单栏消失的解决办法 1 打开注册表编辑器 2 VISIO 2000 HKEY CURRENT USER Software Visio Visio2000 Toolbars 删除上述键值 再启动VISIO 2000就可
  • 查看占用指定端口的程序

    netstat lntup grep 8080
  • 【半监督学习】5、Efficient Teacher

    文章目录 一 背景 二 方法 2 1 Dense Detector 2 2 Pseudo Label Assigner 2 3 Epoch Adaptor 三 效果 论文 Efficient Teacher Semi Supervised
  • brpc组件bvar源码解析(四)Sampler、SamplerCollector和Window类簇

    1 Sampler类 Sampler是所有采样类的基类 采样类中最重要的是take sample函数 采样类的schedule函数调用之后 它的take sample函数将会被一个专门的线程每1秒定时调用 Sampler类的定义 Sampl
  • Redis持久化存储RDB(写时复制)/AOF

    快照 RDB save 会阻塞当前Redis服务器 直到持久化完成 线上应该禁止使用 明确时间点 关机维护 bgsave fork一个子进程 由子进程负责持久化过程 父进程发生写操作修改内存数据时 Copy On Write 才会真正去分配
  • NFS服务详解

    文章目录 一 NFS概述 二 NFS工作原理 2 1NFS工作流程 2 2挂载原理 三 NFS服务部署 3 1常用命令 3 2服务器端配置 3 3客户端配置 3 4服务测试 四 总结 一 NFS概述 1 概述 NFS是一种基于TCP IP
  • 分享菜鸟学Python,从入门到进阶的心得

    来自一位投稿粉丝的学习心得 从最初学Python从爬虫开始 到数据分析 再到GUI的实现 以及后来的机器学习和深度学习文章 我与大家已经走过了好几个月的时间 在这几个月的时间里 我通过文章与大家一同学习 一同进步 向大家展示了如何通过Pyt
  • 第三章 分类模型-随机森林知识点详细总结

    机器学习算法系列 第一章 Python Spark 分类模型 逻辑回归知识点详细总结 第二章 分类模型 决策树知识点详细总结 第三章 分类模型 随机森林知识点详细总结 第四章 分类模型 支持向量机SVM知识点详细总结第五章 关联分析 apr
  • CocosCreator3.8研究笔记(十四)CocosCreator 资源管理Asset Manager

    在游戏的开发过程中 需要使用到大量的图片 音频等资源来 从而带来管理上的困难 Asset Manager 资源管理模块具备加载资源 查找资源 销毁资源 缓存资源 Asset Bundle 等功能 帮助开发者管理其资源的使用 一 资源的加载