/* bench/mem_sim.c — 宿主内存测量 harness(OOM 瘦身验证)。 * * 目的:把 ncm 相关块的匿名 RSS(RssAnon)拆开,验证封面降采样(meow_img_downscale)收益。 * 依赖:仅 host SDK 对象(meow_ui_init 装字库 + meow_img 解码),无需 App/core 对象。 * 用法:MEM_SIM=1 ./ncm_host * * 场景(各阶段 RssAnon,KB): * [0] meow_ui_init 后基线(含字库 plane + back_buf + 启动堆)。 * [1] meow_img_load_file(全尺寸封面 1448x1448) —— 全尺寸 RGBA ≈ 8MB 驻留。 * [2] meow_img_downscale(480) + free 原图 —— RGBA 降到 ≤480x480 ≈ 0.9MB。 * 断言:RssAnon[1]-RssAnon[0] > 2MB(大封面确实驻留),RssAnon[2] < RssAnon[1]-4MB * (降采样省 >4MB,可验证)。 */ #include "../app/ncm_app_internal.h" #include #include #include #include static long rss_anon_kb(void) { FILE *f = fopen("/proc/self/status", "r"); if (!f) return -1; char line[256]; long v = -1; while (fgets(line, sizeof line, f)) if (strncmp(line, "RssAnon:", 8) == 0) { v = atol(line + 8); break; } fclose(f); return v; } static int mem_sim_run(void) { meow_ui_opts o = { APP_W, APP_H }; if (meow_ui_init(&o) != 0) { printf("mem: meow_ui_init FAILED\n"); return 1; } long r0 = rss_anon_kb(); printf("mem[0] baseline (font plane + back_buf + startup): RssAnon=%ldKB\n", r0); if (r0 < 0) { printf("mem: cannot read RssAnon\n"); return 1; } const char *cover = "/tmp/ncmfont/cover_current.jpg"; if (access(cover, F_OK) != 0) { printf("mem: warning: %s not found; skip cover scenario\n", cover); } else { meow_img *f0 = meow_img_load_file(cover); if (!f0) { printf("mem: cover load FAILED\n"); return 1; } long r1 = rss_anon_kb(); printf("mem[1] cover full-res %dx%d loaded: RssAnon=%ldKB (delta=%ldKB)\n", meow_img_w(f0), meow_img_h(f0), r1, r1 - r0); meow_img *small = meow_img_downscale(f0, 480); if (small) meow_img_free(f0); long r2 = rss_anon_kb(); int w = small ? meow_img_w(small) : (f0 ? meow_img_w(f0) : 0); int h = small ? meow_img_h(small) : (f0 ? meow_img_h(f0) : 0); printf("mem[2] cover downscaled to %dx%d: RssAnon=%ldKB (delta_from_full=%ldKB)\n", w, h, r2, r2 - r1); int ok = (r1 - r0 > 2048) && (r1 - r2 > 4096) && (small != NULL) && (w <= 480 && h <= 480); printf("mem: cover-downscale %s (full_delta=%ldKB, saved=%ldKB, size=%dx%d)\n", ok ? "PASS" : "FAIL", r1 - r0, r1 - r2, w, h); if (small) meow_img_free(small); } meow_ui_shutdown(); printf("mem: done\n"); return 0; } int main(void) { if (getenv("MEM_SIM") && getenv("MEM_SIM")[0] == '1') return mem_sim_run(); /* 未设 MEM_SIM:宿主页面测试走 test_ncm_app.c 的 driver(本文件被链时只占位)。 */ printf("mem_sim: set MEM_SIM=1 to run memory scenarios\n"); return 0; }