跳到主要内容

资源加载、缓存与释放

级别:首作必学。 包内文件大小、下载量、解码后内存和 GPU 纹理占用是不同指标。压缩图片很小,也可能在运行时占用较大内存。

资源是什么​

SpriteFrame 描述精灵使用的纹理区域;Prefab 保存节点结构;AudioClip 表示声音资源;字体、动画和 JSON 配置也属于资源。先从编辑器引用资源开始,再学习按需加载。

方式适用场景主要责任
场景或 Prefab 静态引用首屏必需、小规模内容控制引用导致的依赖范围
资源目录动态加载按名称加载本地内容路径、类型、失败和释放
Asset Bundle按功能或关卡分组包边界、依赖与加载时机
远程资源可更新的大体积内容版本、CDN、缓存与失败恢复

一个加载片段​

// Cocos 片段,导入 resources、SpriteFrame。
resources.load('cards/apple/spriteFrame', SpriteFrame, (error, frame) => {
if (error) {
// 显示可恢复错误或默认牌面,同时记录资源路径。
return;
}
// 应先确认请求仍属于当前场景/当前局,再把 frame 交给视图。
});

示例要求资源放在 Creator 的 assets/resources/cards/ 中,实际路径与导入资源结构一致。后缀和类型以编辑器生成资源为准,不能对任意图片路径机械拼接。

先定义加载状态​

至少区分 loading、ready、failed。只在必需资源就绪后允许开始。失败页保留重试,不让玩家面对无响应按钮。展示进度时,明确它代表文件数还是字节量,避免假装所有阶段都能精确线性计量。

预加载下一关时限制并发,避免在当前关突然创建大量纹理、节点和音频。下载完成不等于实例化、解码和 GPU 上传都完成。

释放需要所有权​

不要为节省内存随意对共享纹理执行强制释放。先了解资源依赖与引用计数,确认没有其他场景、Prefab 或 Sprite 使用。退出关卡时清理事件、定时器和节点引用,否则资源可能被间接持有。

对象池解决的是高频创建销毁成本,也会保留对象和资源;首版卡牌数量很少时,优先使用简单清晰的生命周期。

练习:让一张资源路径错误,确认能重试或降级;连续进出关卡,观察节点数和内存是否持续增长。完成标准:能指出资源归属、失败行为和释放时机。

参考:Cocos 资源管理、UI Power 资源与加载。