Appearance
缓存与性能
缓存层级
| 层 | 内容 | 目标 |
|---|---|---|
| 内存 | 当前与相邻章节、prepared pages | 边界即时切换 |
| 持久内容缓存 | 网络章节正文和元数据 | 离线/重启复用 |
| 图片缓存 | 封面、正文图、解码结果 | 避免重复下载/解码 |
| 布局缓存 | typography + viewport 对应分页 | 减少重复 TextKit 工作 |
预取窗口遵守用户设置 1–10,默认值不会被代码静默提高。低电量或 serious/critical thermal 状态收缩到更小窗口并抑制网络预取。
性能门槛
- 准备完成的章节边界零 I/O、零清洗、零分页;
- 500 次翻页 p95 不高于 16.7 ms(60 Hz);
- 无单帧达到 50 ms;
- 连续滚动章节连接无明显空白、裁剪或 remount;
- 20–30 分钟阅读无持续内存增长和无意义后台工作。
这些指标必须使用 Release 构建和真机 Instruments 验证。Windows 静态测试只能证明代码 结构与范围连续性,不能证明触摸和帧时间。
帧监控指标
阅读器内置的帧监控会持续统计 estimatedDroppedFrames(估算丢帧数)、 stallsAtLeast50Ms(≥50ms 的卡顿次数)、以及帧耗时的 p95/最大值,方便在没有连上 Instruments 的情况下也能定位问题。判读时注意区分两种模式:
- 滑动分页的抖动通常来自“单页内容第一次构建”——比如章节刚加载完、还没预取到下一页时 用户就翻过去了,此时能看到一次孤立的高帧耗时尖峰;
- 连续滚动的抖动更容易连续出现——如果懒加载容器的页面在滚动到可视区域时才开始分页/ 渲染,会表现为“滚动越快、卡顿越密集”,而不是孤立尖峰。
如果丢帧集中在“设置面板刚关闭、重新分页触发的第一次重排”,通常说明本次重排触发了整章 重新分页而不是局部更新,可以对照分页与连续滚动里“重新分页会生成 全新页面标识”的说明,先确认是否本该走局部更新的场景意外触发了整体重建。
