长章节内存优化 P1:章节级共享显示内容与 layouter,高亮转 overlay
- 新增 RDEPUBChapterDisplayContentCache(LRU 2,主线程限定,控制器
持有):整章显示串构建时一次性注入全章主题色与暗黑图替换,配套
共享 DTCoreTextLayouter;签名 = 章节内容对象标识 + 主题双色 +
暗黑图配置,设置/主题变化自动失效重建
- RDEPUBTextContentView.configure 改为引用共享 entry,删除每次翻页
的整章可变拷贝与按页属性写入
- 高亮/下划线改走 overlay decoration(高亮背景层、下划线前景层),
移除 applyHighlightsToContent 与 render view 的属性绘制路径,
高亮增删不再触发整章重建
- 内存警告时清空 display cache;shouldAvoidReaderPageCaching 保持
保守(P1-4 待真机数据)
验证:编译通过;高亮/批注/选区/翻页/设置 13 项 UI 回归全过。
SearchTests 10 项失败经二分确认为先存回归(5a41066 与 e4e629a 均
复现,最后已知通过为 2026-06-08),与本次改动无关,待单独排查。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
e4e629a06c
commit
c4be426299
@@ -61,28 +61,26 @@
|
||||
|
||||
**任务**:
|
||||
|
||||
- [ ] 在章节运行时侧(建议挂在 `RDEPUBRuntimeChapter` 或新建 `RDEPUBChapterDisplayCache`)新增:
|
||||
- `chapterDisplayContent`(`typesetAttributedString` 的一次性拷贝)
|
||||
- `displaySignature`(组成:主题、暗黑图配置、字体设置、本章高亮集合版本)
|
||||
- [ ] 构建共享内容时一次性注入:全章范围主题色;全章范围高亮/下划线属性(若 P1-2 决定转 overlay 则此项取消)
|
||||
- [ ] 确定暗黑图策略(二选一):
|
||||
- a. 构建时全章一次性替换(依赖 `RDEPUBDarkImageAdjuster` 的 NSCache 兜底解码成本)
|
||||
- b. 移到渲染时按可见附件替换,不触碰共享字符串
|
||||
- [ ] `RDEPUBTextContentView.configure` 改为接收"共享内容引用 + `page.contentRange`",删除 443 行的整章拷贝
|
||||
- [ ] 高亮增删、搜索激活、主题/设置变化 → 比对 `displaySignature`,不一致则重建共享内容(禁止原地修改)
|
||||
- [ ] 章节淘汰(`RDEPUBChapterRuntimeStore.evict` / `handleMemoryWarning` / `invalidateAllForSettingsChange`)同步释放 display cache
|
||||
- [x] 已新建 `RDEPUBChapterDisplayContentCache`(LRU 容量 2,主线程限定,`RDEPUBReaderController` 持有):`content` + `layouter` + `signature`
|
||||
- [x] 构建共享内容时一次性注入:全章范围主题色;高亮/下划线因 P1-2 转 overlay,不进共享内容也不进签名
|
||||
- [x] 暗黑图策略选 a:构建时全章一次性替换,复用 `RDEPUBDarkImageAdjuster` 的 NSCache
|
||||
- [x] `RDEPUBTextContentView.configure` 已改为接收 `displayCache` 参数并引用共享 entry,整章拷贝已删除
|
||||
- [x] 签名 = 章节内容对象标识 + 长度 + 主题双色 + 暗黑图配置;设置/主题变化经签名自动失效重建(高亮变化不触发重建,仅重建 overlay 装饰)
|
||||
- [x] 控制器在 `didReceiveMemoryWarning` 清空 display cache;设置变更重建 chapterContent 实例后由签名兜底换代
|
||||
|
||||
**验收**:连续翻页不再出现整章拷贝(打点确认);翻页延迟下降;高亮显示、高亮点击菜单、underline、搜索 currentMatch、附件点击、选区拖拽全部回归通过。
|
||||
|
||||
> 2026-07-08 回归记录:高亮/批注/选区/翻页/设置 13 项 UI 用例全过;SearchTests 10 项失败,但已在会话前提交 5a41066 与 P0 提交 e4e629a 上复现同样失败(搜索 0 命中),确认为先于本优化存在的独立回归(最后一次已知通过是 2026-06-08 全量跑),需单独排查,与 P1 改动无关。
|
||||
|
||||
### P1-2 高亮/下划线剥离为 overlay(与 P1-1 绑定)
|
||||
|
||||
**现状**:搜索高亮已走 overlay(`RDEPUBTextContentView.swift:759` 处 `buildDecorations` 传 `highlights: []`,注释明确为避免双画);普通高亮/下划线仍靠写 `kRDEPUBHighlightAttributeName` / `kRDEPUBUnderlineAttributeName` 属性由 render view 绘制。
|
||||
|
||||
**任务**:
|
||||
|
||||
- [ ] `buildDecorations` 改为传入真实 highlights,高亮/下划线由 decoration 层绘制
|
||||
- [ ] 移除 `applyHighlightsToContent`(`RDEPUBTextContentView.swift:617`)及 render view 对两个自定义属性的绘制路径,确认无双画
|
||||
- [ ] 高亮命中(`highlight(at:)`)与菜单锚点继续走 `interactionController.selectionRects`,坐标保持 chapter-absolute
|
||||
- [x] `buildDecorations` 已传入真实 highlights,高亮进背景层(文字下方)、下划线进前景层
|
||||
- [x] `applyHighlightsToContent` 与 render view 的 `drawHighlights`/`computeHighlightRects`/`attributedDisplayContent` 已整体移除,无双画
|
||||
- [x] 高亮命中与菜单锚点继续走 `interactionController.selectionRects`,坐标保持 chapter-absolute(未改动)
|
||||
|
||||
**验收**:高亮/下划线视觉与改前一致(含跨页高亮的页内裁剪);高亮点击弹菜单正常;与搜索高亮叠加时无双画。
|
||||
|
||||
@@ -92,10 +90,10 @@
|
||||
|
||||
**任务**:
|
||||
|
||||
- [ ] `DTCoreTextLayouter` 随 `chapterDisplayContent` 一起放入章节级 display cache,与 signature 同生命周期
|
||||
- [ ] 页面按 `bounds` + `page.contentRange` 取 `layoutFrame`;`RDEPUBTextPageVerticalJustifier.justify` 会修改 layoutFrame,因此 **保持 `shouldCacheLayoutFrames = false`**,layoutFrame 永远按页新建、不共享
|
||||
- [ ] bounds 变化(横竖屏/双页)纳入失效条件;确认旧 layoutFrame 随页面视图释放
|
||||
- [ ] `RDEPUBTextPageBoundaryValidator` 校验路径不变
|
||||
- [x] `DTCoreTextLayouter` 已随共享内容放入 display cache,与 signature 同生命周期
|
||||
- [x] 页面按 `bounds` + `page.contentRange` 取 `layoutFrame`;`shouldCacheLayoutFrames = false` 保持,layoutFrame 按页新建(VerticalJustifier 的修改不会污染共享对象)
|
||||
- [x] framesetter 只依赖字符串、与 bounds 无关,bounds 变化无需失效共享对象;layoutFrame 随页面视图释放
|
||||
- [x] `RDEPUBTextPageBoundaryValidator` 校验路径不变
|
||||
|
||||
**验收**:翻页时不再重建 framesetter(打点确认);横竖屏切换后布局正确;`--demo-pagination-validate` 不回升。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user