图库: 阅读器两级清晰度,先低档上屏、停稳再换清晰(M31)

真机 1280x2275 单页解码 392ms,首次看某页有一瞬加载感。改成:
- 大页(JPEG ≥1MP)先按显示长边一半的档位(真机页=step 4)解一版低档,
  精确落到显示框后立刻上屏(换图仍是单次原生 blit,不闪白、不重置缩放/滚动);
- 停稳 200ms 后才解目标档位(step 2),在**同一槽**原地替换低档,低档随即释放,
  常驻不翻倍;高档失败/预算跳过时保留低档,不把整页标成「内存不足」;
- 拖动/连翻/条漫滚动/跳页在途期间只解低档;高档请求复用 M22 的 gen/窗口
  stale 判据作废(只多一条 sharpen 谓词),出队前/后两条路径都计入取消;
- 日志尾部新增 tier=low|high(取消行同),真机可直接核对先糊后清。

分档只给 JPEG:step 是 JPEG 缩解概念,PNG/BMP 后端按目标逐行丢行本来就不慢,
且峰值模型对非 JPEG 按「输出=显示框」建模,多一条小图→落框路径会让模型低估
(不新增解码路径,也不改 sdk/ 与 page_source 的唯一模型)。

宿主回归:
- test_reader_membudget B10:JPEG 低档先落位(open 不阻塞)→ 高档落同槽
  (槽内字节不变、槽位全程不空)→ 拖动中强塞的高档请求被取消且不被解码;
- B8 连翻 100 页(6 类 1.3–12MP 循环)峰值增量 2714KB ≤3MB、常驻 ≤3MB,
  低档/高档都确实跑过;B3 断言小页保持单档(不付两次解码);
- test_reader_perf P11:非 JPEG 大页不分档,仍是一次原生 blit。
This commit is contained in:
AskaEth committed 2026-11-06 13:10:01 +08:00
1 parent ce34974727
commit 62826e1d13
4 files changed
+513 -51

No files matched your search

+17
View File
@@ -10,6 +10,11 @@
extern "C" {
#endif
/* 两级清晰度档位(M31):低档=先上屏的过渡图,高档=停稳后替换的目标档位。
* 同时供宿主测试断言槽内档位用(mr_reader_ui_slot_tier / mr_reader_ui_focus_tier)。 */
#define MR_TIER_LOW 0
#define MR_TIER_HIGH 1
void reader_on_touch_down(int x, int y);
void reader_on_touch_move(int x, int y);
@@ -51,6 +56,18 @@ long mr_reader_ui_resident_cap_kb(void); /* 常驻上限(kB) */
int mr_reader_ui_blit_draws(void); /* 累计原生 blit 绘页次数(热路径应为纯 blit) */
int mr_reader_ui_scaled_draws(void);/* 累计重采样绘页次数(每帧重采样=卡顿) */
int mr_reader_ui_decode_count(void);/* 累计解码次数(查重解抖动/活锁) */
/* ---- M31 两级清晰度(先低档秒出,停稳再换档)---- */
int mr_reader_ui_focus_tier(void); /* 焦点页档位:-1=无图,0=低档过渡图,1=目标档位 */
int mr_reader_ui_slot_tier(int idx);/* 指定页档位:-1=不在槽内,否则同上 */
long mr_reader_ui_slot_kb(int idx); /* 指定槽内页图的常驻字节(KB);0=不在槽内 */
int mr_reader_ui_low_decodes(void); /* 低档解码次数 */
int mr_reader_ui_high_decodes(void);/* 目标档位解码次数 */
int mr_reader_ui_high_canceled(void);/* 被取消(拖动/换页/未停稳)的高档请求数 */
int mr_reader_ui_sharpen_idx(void); /* 当前允许升级的页;-1=拖动/未停稳/无需升级 */
/* 改写「停稳」窗口(默认 MR_SHARPEN_MS=200ms):0=立刻允许高档,很大=冻结高档。 */
void mr_reader_ui_test_set_sharpen_ms(int ms);
/* 绕过停稳判定强排一个「换清晰」请求(验证拖动中会被 M22 的取消通道作废)。 */
void mr_reader_ui_test_queue_high(int idx);
int mr_reader_ui_fit(void); /* 当前 fit 档(MR_FIT_*) */
int mr_reader_ui_chrome(void); /* 1=顶栏可见 */
/* 直接切模式(绕过顶栏 tap 的命中时序;测试用,产品路径仍走顶栏动作)。 */