新增全书字符统计与阅读百分比,并沉淀后台渲染流水线优化方案

- 新增 RDEPUBTextStatisticsCoordinator:后台单线程按章渲染统计全书字符数,footer 显示精确阅读百分比;统计未就绪时(含 PageMap 未覆盖的 loading 页)显示"计算中",不再回退旧页码
- 统计结果按 bookID + renderSignature + 章节内容哈希做磁盘缓存,布局/字号变化自动失效;缓存命中不创建 renderer
- 移除"0.8 秒翻页时间窗轮询让路"逻辑,后续由事件驱动的交互加载门替代(见方案文档 5.6 节)
- 新增 Doc/FeatureSolution/TEXT_STATISTICS_PIPELINE_OPTIMIZATION.md:三条渲染流水线收敛为"交互 + 生产者"、交互加载门、全局后台渲染预算池、后台渲染登记表、两阶段近似百分比、自适应并发的完整优化方案与验收标准

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-07-03 18:38:41 +09:00
co-authored by Claude Fable 5
parent 71f4feb12f
commit 8b68975ee1
14 changed files with 835 additions and 14 deletions
+4
View File
@@ -204,6 +204,7 @@
6FA0125F16DDEDAD341DB75DEB084F4B /* DTHTMLWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = B23C5F038DAC52B75213C0760C431F2B /* DTHTMLWriter.m */; };
7027EF8D77D4082C1BB9B80FF61FCADC /* DTCoreTextLayoutFrame+Cursor.h in Headers */ = {isa = PBXBuildFile; fileRef = 214F0FC87DE99D3FCE69D98B357F3FFC /* DTCoreTextLayoutFrame+Cursor.h */; settings = {ATTRIBUTES = (Public, ); }; };
709C4BA2B6C35035434CD7A41C050A9A /* RDEPUBReaderRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 692FB048CB12876AA971EF21B3F71A27 /* RDEPUBReaderRuntime.swift */; };
70A1B2C3D4E5F60718293A4B /* RDEPUBTextStatisticsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70B1C2D3E4F5061728394A5B /* RDEPUBTextStatisticsCoordinator.swift */; };
70AF1621102FFF12F7DA88DDD8254054 /* RDReaderPagingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E246B080707A0DA836FC0890AE96D529 /* RDReaderPagingController.swift */; };
72E1E0B3B3A46A92E75CA522B9FCB7B6 /* RDEPUBBackgroundTrace.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCB06D5D93327CF4E70EB026DFEFE8BE /* RDEPUBBackgroundTrace.swift */; };
730ACB99580C5982DC08D50FC5084D41 /* DTAttributedTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = B4D20A2B33F9F4DD8499FB462DE2731F /* DTAttributedTextView.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -698,6 +699,7 @@
68D81DF1BB2A14F9C186F75BBA5CF50D /* DTColor+Compatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "DTColor+Compatibility.h"; path = "Core/Source/DTColor+Compatibility.h"; sourceTree = "<group>"; };
69076FC9D4201719C319547346DA3E21 /* DTTextHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTTextHTMLElement.m; path = Core/Source/DTTextHTMLElement.m; sourceTree = "<group>"; };
692FB048CB12876AA971EF21B3F71A27 /* RDEPUBReaderRuntime.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderRuntime.swift; sourceTree = "<group>"; };
70B1C2D3E4F5061728394A5B /* RDEPUBTextStatisticsCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextStatisticsCoordinator.swift; sourceTree = "<group>"; };
6AC1E707308CDBC9FFC09CECE3117A9A /* DTAccessibilityViewProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAccessibilityViewProxy.m; path = Core/Source/DTAccessibilityViewProxy.m; sourceTree = "<group>"; };
6C3F8DF48C6EB28BFD05F5BB49793DDA /* FileManager+ZIP.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "FileManager+ZIP.swift"; path = "Sources/ZIPFoundation/FileManager+ZIP.swift"; sourceTree = "<group>"; };
6C6DCF8FFFAD317C3CA1AEFF60080707 /* RDEPUBTextLayouter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextLayouter.swift; sourceTree = "<group>"; };
@@ -1798,6 +1800,7 @@
94F5CBFE8EF3307F3C9B0E25A5F70E70 /* RDEPUBReaderUIState.swift */,
E8D1DCAA8AAE79FCBD5248D641D583DE /* RDEPUBReaderViewportMonitor.swift */,
3BE6C7E2CF696021A9922C1BB675AB1C /* RDEPUBSelectionState.swift */,
70B1C2D3E4F5061728394A5B /* RDEPUBTextStatisticsCoordinator.swift */,
0C5B69B2CD80274C6E29E5EA8098B935 /* ChapterRuntime */,
);
name = ReaderController;
@@ -2439,6 +2442,7 @@
02A298783B59EBF1DA7E6734E86384BC /* RDEPUBReaderSettings.swift in Sources */,
2925F96E721F741F60C0D2B5AECDBED3 /* RDEPUBReaderSettingsViewController.swift in Sources */,
EC832377DBB2E3443B37165DDDD9F9D6 /* RDEPUBReaderState.swift in Sources */,
70A1B2C3D4E5F60718293A4B /* RDEPUBTextStatisticsCoordinator.swift in Sources */,
0A5BECD47E7FF9EA5C92717197F50DD0 /* RDEPUBReaderTableOfContentsItem.swift in Sources */,
4419BDA1F006E749CA40A99C1E6CEDFF /* RDEPUBReaderTheme.swift in Sources */,
5CE8BD1A9C7FE28802CD9409E4282D5F /* RDEPUBReaderToolView.swift in Sources */,