cocos creator动态加载资源

Cocos Creator多语言游戏开发:资源分离与动态加载实战指南 在游戏开发领域,多语言适配是产品实现全球化发行的关键技术环节,其核心在于解决文本、图片、音频等资源的本地化呈现问题。其基本原理是通过键值对映射与动态资源配置,将语言相关的内容从核心代码中解耦。这项技术的核心价值在于能显著优化包体大小、提升维护效率并支持游戏内实时语言切换,尤其适用于移动端游戏等对包体敏感的场景。Asset Bundle作为资源分包机制,是实现物理分离与按需加载的工程实践基石。本文聚焦于Cocos Creator引擎,详细拆解如何运用资源分离策略,构建一套从规划、编码到部署的完整多语言解决方案 阅读详情

动态加载资源要注意两点,一是所有需要通过脚本动态加载的资源,都必须放置在 resources 文件夹或它的子文件夹下。resources 需要在 assets 文件夹中手工创建,并且必须位于 assets 的根目录

 

resources 文件夹中的资源,可以引用文件夹外部的其它资源,同样也可以被外部场景或资源引用到。项目构建时,除了已在 构建发布 面板勾选的场景外,resources 文件夹中的所有资源,连同它们关联依赖的 resources 文件夹外部的资源,都会被导出。

如果一份资源仅仅是被 resources 中的其它资源所依赖,而不需要直接被 cc.loader.loadRes 调用,那么 请不要 放在 resources 文件夹里。否则会增大包体和 settings.js 的大小,并且项目中无用的资源,将无法在构建的过程中自动剔除。同时在构建过程中,JSON 的自动合并策略也将受到影响,无法尽可能将零碎的 JSON 合并起来。

 

// 动态加载 AnimationClip

var self = this;

cc.loader.loadRes("test assets/anim", function (err, clip) {

self.node.getComponent(cc.Animation).addClip(clip, "anim");

});

 

第二个要注意的是 Creator 相比之前的 Cocos2d-JS,资源动态加载的时候都是 异步 的,需要在回调函数中获得载入的资源。这么做是因为 Creator 除了场景关联的资源,没有另外的资源预加载列表,动态加载的资源是真正的动态加载。

动态加载 Asset

Creator 提供了 cc.loader.loadRes 这个 API 来专门加载那些位于 resources 目录下的 Asset。和 cc.loader.load 不同的是,loadRes 一次只能加载单个 Asset。调用时,你只要传入相对 resources 的路径即可,并且路径的结尾处 不能 包含文件扩展名。

// 加载 Prefab cc.loader.loadRes("test assets/prefab", function (err, prefab) { var newNode = cc.instantiate(prefab); cc.director.getScene().addChild(newNode); }); // 加载 AnimationClip var self = this; cc.loader.loadRes("test assets/anim", function (err, clip) { self.node.getComponent(cc.Animation).addClip(clip, "anim"); });

加载 SpriteFrame

图片设置为 Sprite 后,将会在 资源管理器 中生成一个对应的 SpriteFrame。但如果直接加载 test assets/image,得到的类型将会是 cc.Texture2D。你必须指定第二个参数为资源的类型,才能加载到图片生成的 cc.SpriteFrame:

// 加载 SpriteFrame var self = this; cc.loader.loadRes("test assets/image", cc.SpriteFrame, function (err, spriteFrame) { self.node.getComponent(cc.Sprite).spriteFrame = spriteFrame; });

如果指定了类型参数,就会在路径下查找指定类型的资源。当你在同一个路径下同时包含了多个重名资源(例如同时包含 player.clip 和 player.psd),或者需要获取 “子资源”(例如获取 Texture2D 生成的 SpriteFrame),就需要声明类型。

加载图集中的 SpriteFrame

对从 TexturePacker 等第三方工具导入的图集而言,如果要加载其中的 SpriteFrame,则只能先加载图集,再获取其中的 SpriteFrame。这是一种特殊情况。

// 加载 SpriteAtlas(图集),并且获取其中的一个 SpriteFrame // 注意 atlas 资源文件(plist)通常会和一个同名的图片文件(png)放在一个目录下, 所以需要在第二个参数指定资源类型 cc.loader.loadRes("test assets/sheep", cc.SpriteAtlas, function (err, atlas) { var frame = atlas.getSpriteFrame('sheep_down_0'); sprite.spriteFrame = frame; });

资源释放

loadRes 加载进来的单个资源如果需要释放,可以调用 cc.loader.releaseRes,releaseRes 可以传入和 loadRes 相同的路径和类型参数。

cc.loader.releaseRes("test assets/image", cc.SpriteFrame); cc.loader.releaseRes("test assets/anim");

此外,你也可以使用 cc.loader.releaseAsset 来释放特定的 Asset 实例。

cc.loader.releaseAsset(spriteFrame);

资源批量加载

cc.loader.loadResDir 可以加载相同路径下的多个资源:

// 加载 test assets 目录下所有资源 cc.loader.loadResDir("test assets", function (err, assets) { // ... }); // 加载 test assets 目录下所有 SpriteFrame,并且获取它们的路径 cc.loader.loadResDir("test assets", cc.SpriteFrame, function (err, assets, urls) { // ... });

加载远程资源和设备资源

在目前的 Cocos Creator 中,我们支持加载远程贴图资源,这对于加载用户头像等需要向服务器请求的贴图很友好,需要注意的是,这需要开发者直接调用 cc.loader.load。同时,如果用户用其他方式下载了资源到本地设备存储中,也需要用同样的 API 来加载,上文中的 loadRes 等 API 只适用于应用包内的资源和热更新的本地资源。下面是这个 API 的用法:

// 远程 url 带图片后缀名 var remoteUrl = "http://unknown.org/someres.png"; cc.loader.load(remoteUrl, function (err, texture) { // Use texture to create sprite frame }); // 远程 url 不带图片后缀名,此时必须指定远程图片文件的类型 remoteUrl = "http://unknown.org/emoji?id=124982374"; cc.loader.load({url: remoteUrl, type: 'png'}, function () { // Use texture to create sprite frame }); // 用绝对路径加载设备存储内的资源,比如相册 var absolutePath = "/dara/data/some/path/to/image.png" cc.loader.load(absolutePath, function () { // Use texture to create sprite frame });

目前的此类手动资源加载还有一些限制,对用户影响比较大的是:

  1. 原生平台远程加载不支持图片文件以外类型的资源

  2. 这种加载方式只支持图片、声音、文本等原生资源类型,不支持 SpriteFrame、SpriteAtlas、Tilemap 等资源的直接加载和解析(需要后续版本中的 AssetBundle 支持)

  3. Web 端的远程加载受到浏览器的 CORS 跨域策略限制,如果对方服务器禁止跨域访问,那么会加载失败,而且由于 WebGL 安全策略的限制,即便对方服务器允许 http 请求成功之后也无法渲染。

资源的依赖和释放

在加载完资源之后,所有的资源都会临时被缓存到 cc.loader 中,以避免重复加载资源时发送无意义的 http 请求,当然,缓存的内容都会占用内存,有些资源可能用户不再需要了,想要释放它们,这里介绍一下在做资源释放时需要注意的事项。

首先最为重要的一点就是:资源之间是互相依赖的。

比如下图,Prefab 资源中的 Node 包含 Sprite 组件,Sprite 组件依赖于 SpriteFrame,SpriteFrame 资源依赖于 Texture 资源,而 Prefab,SpriteFrame 和 Texture 资源都被 cc.loader 缓存起来了。这样做的好处是,有可能有另一个 SpriteAtlas 资源依赖于同样的一个 SpriteFrame 和 Texture,那么当你手动加载这个 SpriteAtlas 的时候,就不需要再重新请求贴图资源了,cc.loader 会自动使用缓存中的资源。

 

在搞明白资源的相互引用之后,资源释放的问题也就呼之欲出了,当你选择释放一个 Prefab 时,我们是不会自动释放它依赖的其他资源的,因为有可能这些依赖资源还有其他的用处。所以用户在释放资源时经常会问我们,为什么我都把资源释放了,内存占用还是居高不下?原因就是真正占用内存的贴图等基础资源并不会随着你释放 Prefab 或者 SpriteAtlas 而被释放。

接下来要介绍问题的另一个核心:JavaScript 中无法跟踪对象引用。

在 JavaScript 这种脚本语言中,由于其弱类型特性,以及为了代码的便利,往往是不包含内存管理功能的,所有对象的内存都由垃圾回收机制来管理。这就导致 JS 层逻辑永远不知道一个对象会在什么时候被释放,这意味着引擎无法通过类似引用计数的机制来管理外部对象对资源的引用,也无法严谨得统计资源是否不再被需要了。基于以上的原因,目前 cc.loader 的设计实际上是依赖于用户根据游戏逻辑管理资源,用户可以决定在某一时刻不再需要某些资源以及它依赖的资源,立即将它们在 cc.loader 中的缓存释放。也可以选择在释放依赖资源的时候,防止部分共享资源被释放。下面是一个简单的示例:

// 直接释放某个贴图 cc.loader.release(texture); // 释放一个 prefab 以及所有它依赖的资源 var deps = cc.loader.getDependsRecursively('prefabs/sample'); cc.loader.release(deps); // 如果在这个 prefab 中有一些和场景其他部分共享的资源,你不希望它们被释放,可以将这个资源从依赖列表中删除 var deps = cc.loader.getDependsRecursively('prefabs/sample'); var index = deps.indexOf(texture2d._uuid); if (index !== -1) deps.splice(index, 1); cc.loader.release(deps);

最后一个值得关注的要点:JavaScript 的垃圾回收是延迟的。

想象一种情况,当你释放了 cc.loader 对某个资源的引用之后,由于考虑不周的原因,游戏逻辑再次请求了这个资源。此时垃圾回收还没有开始(垃圾回收的时机不可控),或者你的游戏逻辑某处,仍然持有一个对于这个旧资源的引用,那么意味着这个资源还存在内存中,但是 cc.loader 已经访问不到了,所以会重新加载它。这造成这个资源在内存中有两份同样的拷贝,浪费了内存。如果只是一个资源还好,但是如果类似的资源很多,甚至不止一次被重复加载,这对于内存的压力是有可能很高的。如果观察到游戏使用的内存曲线有这样的异常,请仔细检查游戏逻辑,是否存在泄漏,如果没有的话,垃圾回收机制是会正常回收这些内存的。

以上就是管理资源依赖和释放时需要注意的细节。

cocos creator入门教程(十九)—— loader代码加载和释放资源 cc.loader 1:有三个默认的Pipeline: (1) assetLoader: 主要用于加载资源, 加载asset类型资源,和释放这些资源; (2) downloader: 主要用于下载文件, 文本,图像,脚本,声音,字体, 自定义的download; (3) loader: 第三个默认的Pipeline,可以加载json, image, pli... 阅读详情

相关推荐

Cocos Creater (3.5.0)资源动态加载与释放揭秘。

由于javascript 无法对赋值运算符重载,导致cocoscreater 动态加载引用计数无法统计(即将一个对象赋值给另一个对象是,计数加1,但是由于无法重载,故需要用户在实际赋值时自己维护引用计数)。需要用户自己处理资源的引用计数,其中资源又有可能出现静态引用/动态引用混用的情况。容易导致通过assetManager.releaseAsset释放资源出错,提供一个解决资源的释放管理方案以及相关结论分析。

gjl513627 808

Javascript NodeJS Typescript 动态加载和使用字符串里的类示范,实现热更新热添加热修改策略(核心代码)方案

Javascript NodeJS Typescript 动态加载和使用字符串里的类示范,实现热更新关键策略代码 需求场景 需要动态加载某些模块或者执行某些代码,例如当前我项目核心位置有若干个策略,且需要能热添加、修改、删除,而按照传统做法我需要修改源代码后重新发布项目,不太方便,改一次就要发布一次,重启一次。因此采用如下方案解决 由传统的加载本地模块变为从数据库中查询策略源代码并加载执行 更新代码后,通知所有策略实例热重新启动即可完成更新。 关键技术点验证 动态加载类并创建该类对象 类 class Tes

HumorChen的博客 2227

qrcode TS版本 动态生成二维码

qrcode生成二维码在很多游戏应用被广泛使用,白鹭里可以直接使用,如果是其他引擎,只需要修改qrcode.draw()方法即可实现,简单,游戏应用内动态生成二维码超级方便

Cocos Creator实现txt文件数值的导入

标题Cocos Creator实现txt文件数值的导入 1.首先先定义一个txt文件,拖拽即可 2.取数值 3.取出的数值根据需要对其进行相应的类型转换parseFloat(),parseInt(); ...

qq_43588531的博客 2323

ArcGIS中地理坐标系与投影坐标系以及投影转换

简单介绍arcgis软件中坐标系定义、设置和常见问题。

weixin_41399650的博客 8万+

从C-EPS到DP-EPS:手把手图解不同EPS类型怎么选,对你的车操控感影响有多大?

方向盘转动时那股细腻的阻尼感,高速过弯时令人安心的沉稳,或是狭窄车位里一根手指就能拨动的轻盈——这些看似微妙的差异,其实都源自转向系统电机那几厘米的安装位置变化。当我们谈论驾驶乐趣时,发动机参数和悬架调校总是占据C位,但真正连接驾驶者与车辆的神经末梢,恰恰是那套默默工作的电动助力转向系统(EPS)。不同EPS类型带来的操控特性差异,可能比马力数字更能定义一辆车的性格。

weixin_30920513的博客 531

require 动态加载_TS/JS 模块自加载与热重载

很多时候,特别是在开发过程中,我们希望能够不需要频繁重启服务就立即应用改动的代码。但在常驻内存的服务器应用中,要实现这种需求并不简单。强引用和弱引用因为常驻内存的自然特性,变量存在强引用的问题,特别是在像 CommonJS 这样的模块加载方案中,一旦 `require/import` 的模块被赋值到了新的变量中,它就自动形成了对模块的“拷贝”,即原模块发生改变之后,在导入的地方,这个改变将毫无作用...

weixin_39562998的博客 2854

MIPI DSI2接口开发避坑指南:以RK3576的GM8775C桥接芯片调试为例

本文以RK3576平台搭配GM8775C桥接芯片为例,深入剖析MIPI DSI2接口开发中的常见问题与解决方案。文章详细解读了从U-Boot阶段到内核DRM驱动架构的完整显示通路构建,重点分享了电源时序管理、寄存器配置与硬件协同调试等实战经验,为嵌入式显示系统开发者提供了一套系统化的避坑指南和调试方**。

weixin_29290379的博客 328

cocos creator资源管理器,资源动态加载和释放

Cocos2.4.11版本资源管理摘要: 资源引用计数需手动管理,动态加载资源需调用addRef/decRef; 静态与动态资源冲突时,动态资源释放可能导致静态资源失效; 推荐方案: 所有预制体采用动态加载 预加载复杂界面资源 延迟释放机制(默认5秒) 实现要点: ResMgr统一管理加载/释放 UIBase基类维护资源计数 支持Bundle管理、引用计数和加载队列 特殊场景处理: 场景挂载资源时需配合cocos引用计数 提供releaseAsset直接释放资源

github_38633141的博客 1432

大模型测试人员完整学习体系(分层成长路线 + 知识框架 + 落地实操)

本文系统构建了大模型测试工程师的4级能力成长体系:L1(测试执行)-L2(专项测试)-L3(质量体系)-L4(行业标准),详细拆解了每个阶段的核心技能图谱。重点包括:入门层需掌握传统测试基础和大模型产品逻辑;进阶层需精通Prompt用例设计、RAG测试、安全对齐、自动化评测等专项能力;高级层聚焦评测平台搭建与质量体系建设;专家层深入算法对齐与行业标准制定。文章配套提供了分阶段技术工具栈、3-12个月学习路径及5类实战项目建议,形成了一套完整的大模型测试人才能力培养框架。

SmallBull的博客 455

openclaw本地模型对接

使用是官方推荐的一种集成方式,它可以简化配置过程。但由于您的系统环境和之前复杂的配置历史,我为您梳理了一个核心流程,并增加了关键的“事后检查”步骤,以确保能从根本上解决问题。

suny8的专栏 2460

cocos creator 动态加载资源

cocos creator 动态加载资源 引入文件路径 import resPath from "resPath"; 加载整个文件夹 //动态加载某个文件下的所有资源,并使用 setSpriteFrame(sprite, name) { let texName = resPath[name]; cc.loader.loadResDir(texName, cc.SpriteFrame, (error, object) => { i

WinoGameStudio的博客 473

将Windbg附加到软件进程上排查异常闪退的问题

使用Windbg和Process Explorer排查因为内存泄漏导致的软件异常闪退问题。

dvlinker的技术专栏 1万+

cocos creator 安卓原生平台环境_Creator | 资源管理:资源的动态加载/缓存/预加载/同步加载...

加载资源:https://docs.cocos.com/creator/manual/zh/scripting/dynamic-load-resources.html缓存管理器:https://docs.cocos.com/creator/manual/zh/asset-manager/cache-manager.html//resources目录 //所有需要通过脚本动态加载的资源...

weixin_32379547的博客 946

MFC实现图书管理系统(附完整源码)

MFC实现图书管理系统(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 800

[企业AI落地] RAG 知识库系统在多租户环境下的细粒度权限隔离设计

多租户 RAG 系统真正的风险不只是搜不到,而是把不该看到的内容查出来、说出来、写回去。本文结合多客户售后知识助手场景,用元数据结构、向量检索过滤、回答策略和审计回写示例拆解租户、资源、检索、生成、审计五层权限边界。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 220

Cocos Creator资源动态加载进阶:从Asset Bundle到内存管理实战

资源动态加载是现代游戏开发中的核心技术,它通过按需加载与释放资源,有效解决首包体积过大、内存占用过高等性能瓶颈。其核心原理在于将资源从构建时静态引用转变为运行时动态管理,利用资源包(Asset Bundle)机制实现资源的分包、远程部署与独立更新。这项技术的工程价值在于提升应用性能、支持热更新并优化用户体验,尤其适用于中大型游戏、复杂应用及多平台适配场景。在Cocos Creator引擎中,开发者需要掌握Asset Bundle的配置、加载管线以及依赖管理,并警惕“幽灵”资源等常见陷阱,通过分层加载与精细的

weixin_30838873的博客 286

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Cocos Creator 动态加载音效资源

cc.loadRes("Sound/game_turntable.mp3", cc.AudioClip, (err, audioClip)=> { console.log( "==>"+ typeof audioClip); });

LANGZI7758521的专栏 6504

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Cocos Creator 动态加载远程图片资源

这个问题折腾了我一个下午,很难受,想通过客户端加载远程服务器中的用户头像图片。 var url = "http://localhost:8080/pic/10001.png";//图片路径 var container = this.user_photo.getComponent(cc.Sprite);//图片呈现位置 this.loadImg(container,url); //动态加载图...

厉兵秣码 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Cocos Creator中获取和动态加载资源Asset与Raw Asset

Cocos Creator 有一套统一的资源管理机制 ,在本篇教程,我们将介绍 资源的分类如何在 属性检查器 里设置资源动态加载 Asset动态加载 Raw Asset 资源的分类 目前的资源分成两种,一种叫做 Asset,一种叫做 Raw Asset。 Asset Creator 提供了名为 "Asset" 的资源类型,cc.SpriteFrame, cc.Anim

weiyi_de_chengnuo的博客 1万+

Cocos Creator | 资源管理:资源的动态加载/远程加载/缓存/预加载/同步加载/远程加载spine

更好的阅读体验请访问公众号: //resources目录 // 所有需要通过脚本动态加载的资源,都必须放置在resources文件夹或它的子文件夹下 resources文件夹需要在assets根目录下手动创建 resources文件夹中的资源,可以引用文件夹外部的其它资源,同样也可以被外部场景或资源所引用 项目构建时,除了在构建发布面板中勾选的场景外,resources文件夹中的所有资源,包括它们关联依赖的resources文...

Valiancer 1万+

cocos creator 本地动态加载龙骨资源

// 远程加载 var animNode = new cc.Node(); animNode.name = 'animNode'; animNode.parent = cc.find('Canvas'); var dragonDisplay = animNode.addComponent(drago...

erweimac的博客 5640

Cocos学习之资源动态加载

Cocos Creator资源动态加载系统通过`assetManager`实现本地与远程资源管理,提供按需加载、预加载及热更新能力。支持从CDN动态加载图片、分场景加载资源包、AB包增量更新等场景,通过缓存策略优化性能,需注意CORS配置与资源释放管理,适用于多场景游戏与网络化应用开发。

tipsyes的博客 1477

cocos 跨域访问_Cocos Creator 动态加载远程服务器图片资源

var url = "http://localhost:8080/pic/10001.png";//服务器图片路径var container = this.user_photo.getComponent(cc.Sprite);//图片呈现位置this.loadImg(container,url);//动态加载图片的方法loadImg: function(container,url){cc.load...

weixin_35426348的博客 1445

CocosCreator 动态加载与远程加载资源汇总

【代码】CocosCreator 动态加载与远程加载资源汇总。

hawkol的专栏 274
上一篇: CocosCreator客户端优化系列(二):渲染优化
下一篇: CocosCreator客户端优化系列(三):内存优化
wang2021wang
博客等级 码龄15年 6粉丝 2原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值