图库: 阅读器两级清晰度,先低档上屏、停稳再换清晰(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:
1 parent
ce34974727
commit
62826e1d13
4 files changed
+513
-51
No files matched your search
@@ -15,7 +15,12 @@
|
||||
* P5 「先点适高,再切条漫」:scaled 不增长(评审点名的第二入口);
|
||||
* P6 双击放大再双击缩回:缩回后按新几何重解 → scaled 不增长(P2-1);
|
||||
* P7 静止若干帧不产生新解码(无重解抖动/活锁,P2-2);
|
||||
* P8 驻留页图有字节上界(<= 9MB)。
|
||||
* P8 驻留页图有字节上界(<= 9MB);
|
||||
* P9 800×1280(评审表格另一档):翻页 + 条漫都必须零重采样;
|
||||
* P10 大屏(1080×1920):fit 目标被字节上限钳住后不得反复重解;
|
||||
* P11 分档策略(M31):非 JPEG 大页不分档(一次解到目标档、仍是原生 blit);
|
||||
* 低档先落位→停稳换清晰→拖动取消的完整生命周期在 test_reader_membudget 的 B10
|
||||
* 用真实 JPEG 夹具覆盖。
|
||||
*
|
||||
* 编译:test/run_tests.sh(与 test_open_book_host 同口径;只发布 meow_ui.a 时 SKIP)。
|
||||
*/
|
||||
@@ -368,6 +373,45 @@ int main(void)
|
||||
"800x1280 webtoon: zero resample (scaled %d -> %d)", st,
|
||||
mr_reader_ui_scaled_draws());
|
||||
|
||||
/* ---- P11 分档策略(M31):非 JPEG 大页不分档——一次解到目标档,仍是原生 blit ----
|
||||
* 低档/高档的完整生命周期(低档先落位→停稳换清晰→拖动取消)在 test_reader_membudget
|
||||
* 的 B10 用真实 JPEG 夹具覆盖;这里只钉住「分档只给 JPEG」这条策略,防止把 PNG/BMP
|
||||
* 也拖进未校准的「小图→落框」峰值路径。 */
|
||||
{
|
||||
char book3[MR_PATH_MAX];
|
||||
snprintf(book3, sizeof book3, "./mr_perf_books_%ld/v3", (long)getpid());
|
||||
int ok3 = mkdir_p(book3) == 0;
|
||||
for (int i = 0; ok3 && i < 2; i++) {
|
||||
char p[MR_PATH_MAX];
|
||||
snprintf(p, sizeof p, "%s/t%d.bmp", book3, i + 1);
|
||||
/* 1600×2400 = 3.84MP:量级与真机大页相同,但格式不是 JPEG。 */
|
||||
if (write_bmp24(p, 1600, 2400, (unsigned)(i + 41)) != 0) ok3 = 0;
|
||||
}
|
||||
if (!ok3) {
|
||||
printf(" SKIP: tier fixture write failed\n");
|
||||
} else {
|
||||
meow_view_page_pop(); /* 关掉 book2 */
|
||||
uint64_t t_open = meow_ui_time_ms();
|
||||
mr_reader_open_dir(book3);
|
||||
uint64_t open_ms = meow_ui_time_ms() - t_open;
|
||||
CHECK(mr_reader_ui_count() == 2, "tier book pages=%d", mr_reader_ui_count());
|
||||
CHECK(open_ms < 500, "open returns without decoding on the UI thread (%llu ms)",
|
||||
(unsigned long long)open_ms);
|
||||
pump_ms(600);
|
||||
draw_once();
|
||||
CHECK(mr_reader_ui_focus_tier() == MR_TIER_HIGH,
|
||||
"non-JPEG big page decodes straight to the target tier (tier=%d)",
|
||||
mr_reader_ui_focus_tier());
|
||||
CHECK(mr_reader_ui_low_decodes() == 0,
|
||||
"no low tier for PNG/BMP (%d low decodes)", mr_reader_ui_low_decodes());
|
||||
int bl = mr_reader_ui_blit_draws(), sc = mr_reader_ui_scaled_draws();
|
||||
draw_once();
|
||||
CHECK(mr_reader_ui_blit_draws() > bl && mr_reader_ui_scaled_draws() == sc,
|
||||
"big BMP page draws as native blit (blit +%d, scaled +%d)",
|
||||
mr_reader_ui_blit_draws() - bl, mr_reader_ui_scaled_draws() - sc);
|
||||
}
|
||||
}
|
||||
|
||||
meow_view_page_pop();
|
||||
meow_view_free(reader);
|
||||
meow_view_free(lib);
|
||||
|
||||
Reference in new issue
Block a user