diff --git a/tuku/ui/reader/reader.c b/tuku/ui/reader/reader.c index df97d55..9679819 100644 --- a/tuku/ui/reader/reader.c +++ b/tuku/ui/reader/reader.c @@ -17,8 +17,8 @@ * 重解一次;拖动/吸附帧只 invalidate 内容区(顶栏静态不重绘)。 * 内存(M17 起;M22 按真机实测重定;M27 接真缩解后端;M32 页槽改 RGB565): * 槽里常驻的是**已落框的 565 位图**(2B/px),单页上限 1.5MB(旧 RGBA 3MB 的同几何口径)、 - * 整窗常驻上限 3.2MB(3 槽 + 1 张在途,超限淘汰最远页)。真机 480×853 页 1599KB → 800KB, - * 两页常驻 3.2MB → 1.6MB。解码仍产出 RGBA,worker 当场转 565 再释放 RGBA;这笔暂存 + * 整窗常驻上限 3.2MB(3 槽 + 1 张在途,超限淘汰最远页)。真机 480×853 页单页 1599KB → 800KB + * (−50%);3 槽常驻 3.2MB → 2.4MB。解码仍产出 RGBA,worker 当场转 565 再释放 RGBA;这笔暂存 * (2B/px)由 reader_estimate_peak 的 convert_bytes 计入预算。解码路径与峰值预算由 * page_source 的 reader_estimate_peak() * 统一判定(唯一实现,本文件不再另写模型): @@ -97,7 +97,7 @@ #define MR_SLOT_BYTES (800L * 1024) /* 真机典型页(480×853)的 565 字节 */ /* 常驻总上限 = 3 槽 + 1 张「已解码未落槽」的在途结果 = 4 × 800KB = 3.2MB。 * 旧口径 3MB 只算槽内 RGBA(3 槽最坏 4.8MB,且在途结果完全没算);565 后把在途结果 - * 一起算进来,真实上限反而收紧。典型稳态(2 页)1.6MB,只有上限的一半。 */ + * 一起算进来,真实上限反而收紧。典型稳态 3 槽 = 2.4MB(窗口只落 2 页时 1.6MB),上限 3.2MB。 */ #define MR_RESIDENT_CAP (4 * MR_SLOT_BYTES) #define MR_SLOT_TOL 2 /* 缓存图与显示框允许的像素偏差(≤2 走原生 blit,不重采样) */ @@ -164,7 +164,7 @@ static int g_fail_paint; /* 窗口内出现解码失败页 → tick /* ---- 页图缓存(≤3 槽,RGB565 常驻)---- * 槽里存的是**已落框**的 565 位图(2B/px),不是解码器的 RGBA:真机 480×853 页 - * 1599KB → 800KB,两页常驻 3.2MB → 1.6MB。命中页绘制 = 每行一次 memcpy(M32)。 */ + * 单页 1599KB → 800KB(−50%),3 槽常驻 3.2MB → 2.4MB。命中页绘制 = 每行一次 memcpy(M32)。 */ typedef struct page_bmp { int w, h; uint16_t *px; /* w*h,行优先,RGB565(不透明) */