KiHan 资源加载框架详解
KiHan 资源加载框架详解
全项目资源加载的唯一底座。加载失败 / 黑图 / 卡顿 / OOM / 内存泄露类问题的机制根源都在这里。
0. 一句话总览:图书馆类比
| 层 | 类比 | 职责 |
|---|---|---|
门面层 KHResManager |
服务台 | 静态单例,全局唯一入口,按环境选 Loader |
策略层 IResLoader |
三种借阅方式 | Editor 直读 / Resources 内置 / AB 加载(线上主路径) |
调度层 KHLoadTaskManager |
借阅排队系统 | Asset/Bundle 双队列 + 并发上限 + 依赖编排 |
| 缓存层 CachePool | 还书暂存架 | 引用计数 + backup 队列 = 软 LRU 卸载 |
IO 线程 FileLoader |
后台仓库管理员 | worker 线程异步读磁盘/APK |
1. 六层分层全景
1 | 业务层 LoadRes / LoadBundle 调用方(UI / 战斗 / 数据 / 特效) |
2. 三种 Loader 对比
| 维度 | KHEditorResLoader | KHResouceResLoader | KHBundleResLoader |
|---|---|---|---|
| 场合 | 编辑器 | Resources 内置包 | 线上正式包 |
| 底层 API | Resources.Load 直读 | Resources.Load | AssetBundle.LoadFromFile + LoadAsset |
| 缓存 | 无 | Asset 缓存 | Asset + Bundle 双缓存 |
| 异步 | 无(全同步) | 有 | 有 |
选择逻辑(KHResManager 构造时三选一):EDITOR → Editor;UseAssetBundle → Bundle(线上主路径);否则 → Resource
3. 核心机制
加载主流程
1 | KHResManager 收请求 → 转给当前 IResLoader |
设备分档 ★
AdjustParamsByDeviceModel()按SystemInfo.systemMemorySize分档- 低内存机 backup 容量置 0 = 引用归零立即卸载(不启用备份缓存)
并发档位
SetLoadingPriority(ThreadPriority):High=1000/100,Normal=8/4,Low=1/1(Asset/Bundle 并发上限)
4. 必知重点与坑
- ⚠ 编辑器测不出线上问题:Editor Loader 无缓存无任务队列无卸载,缓存/OOM/泄露只能真机验
- ⚠
ForceSync开关:LoadRes里有强制同步分支,注释”只在测试环境生效”——加载莫名全同步先查它 - ⚠ EmbededInside 资源泄露:
GetObject未命中时同步补加载,源码 todo 自认泄露 - Lua 资源特殊路径:
KHResUtil.IsLuaRes→ 走LuaScriptResource.LoadAsset直接同步返回 - UILoader:UI 专用门面,UI 层应走它而非直调 KHResManager
5. 排查速查
| 现象 | 先查 |
|---|---|
| 黑图 / 资源丢失 | 缓存池是否被 LRU 卸载;低内存机 backup=0 立即卸载 |
| 加载卡顿 | 并发档位;KHLoadTaskManager 队列积压 |
| OOM | 设备分档;BundleCache 备份容量;ClearBackupCache |
| 编辑器正常真机黑 | Editor Loader 无缓存语义,回源码查 Bundle 路径 |
| 图集丢失 | bundle.xml 清单;AB 依赖 Bundle 编排 |
6. 记忆口诀
一个门面三 Loader,双队列排队进缓存;
引用计数软 LRU,低配机器立即卸;
编辑器全是假象,内存问题真机验。
相关笔记
- [[KiHan热更双引擎详解]](AB 与热更四通道)
- [[KiHan状态机架构详解]](BootSwitchPhase 清缓存时机)
本文从 LearnByCompany 原始文档 自动同步。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 岁迹!
