资源加载、缓存与释放
级别:首作必学。 包内文件大小、下载量、解码后内存和 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 使用。退出关卡时清理事件、定时器和节点引用,否则资源可能被间接持有。
对象池解决的是高频创建销毁成本,也会保留对象和资源;首版卡牌数量很少时,优先使用简单清晰的生命周期。
练习:让一张资源路径错误,确认能重试或降级;连续进出关卡,观察节点数和内存是否持续增长。完成标准:能指出资源归属、失败行为和释放时机。