docs: 新增 .qoder Repowiki 知识库文档

This commit is contained in:
cbb
2026-09-07 12:19:26 +08:00
parent 43d42ad891
commit ef9472334a
105 changed files with 1313322 additions and 263 deletions
+27 -22
View File
@@ -10,11 +10,11 @@
*
* 覆盖:
* 1 默认值:wifi 250 / ecat 50,且 defaultRefreshMap 每次给新对象
* 2 归一 + 钳制:脏值/越界/字符串,**下限按链路**(wifi 50 / ecat 1)
* 2 归一 + 钳制:脏值/越界/字符串,**下限按链路**(wifi 50 / ecat 6)
* 3 旧数据迁移:单个 refreshRate → 只进 wifi,ecat 保持默认
* 4 取值:缺失/脏值回落该链路默认,不回落成另一条链路的值
* 5 隔离:改一条链路不影响另一条(这就是本次改动的全部意义)
* 6 不限速谓词:1ms 档要关掉卡顿黄标与理论 Hz 显示(1ms ≠ 1000Hz)
* 6 不限速谓词:6ms 档要关掉卡顿黄标与理论 Hz 显示(6ms ≠ 166Hz)
*/
import {
REFRESH_DEFAULTS, REFRESH_MIN_MS, REFRESH_MAX_MS, REFRESH_MIN_BY_TP,
@@ -45,11 +45,11 @@ check("defaultRefreshMap 不污染 REFRESH_DEFAULTS 常量", REFRESH_DEFAULTS.wi
/* ── 1b. 下限也按链路 ── */
section("[1b] 每链路最小间隔");
check("ecat 下限 1ms(读本机 PDO 快照,无总线代价)", REFRESH_MIN_BY_TP.ecat === 1,
`实际 ${REFRESH_MIN_BY_TP.ecat}`);
check("ecat 下限 6ms(≈160Hz,与本机 160Hz 屏的绘制上限对齐)",
REFRESH_MIN_BY_TP.ecat === 6, `实际 ${REFRESH_MIN_BY_TP.ecat}`);
check("wifi 下限仍 50ms(每拍是一次无线 HTTP 往返,再快只会积压)",
REFRESH_MIN_BY_TP.wifi === 50, `实际 ${REFRESH_MIN_BY_TP.wifi}`);
check("minRefreshFor('ecat') = 1", minRefreshFor("ecat") === 1);
check("minRefreshFor('ecat') = 6", minRefreshFor("ecat") === 6);
check("minRefreshFor('wifi') = 50", minRefreshFor("wifi") === 50);
check("未知链路回落到兜底下限 50(防御)", minRefreshFor("nope") === REFRESH_MIN_MS);
@@ -57,10 +57,14 @@ check("未知链路回落到兜底下限 50(防御)", minRefreshFor("nope")
section("[2] 归一与钳制(下限按链路)");
const norm = normalizeRefreshMap({ wifi: 400, ecat: 20 });
check("正常值原样保留", norm.wifi === 400);
check("ecat 的 20ms 合法(下限 1ms,不再被抬到 50)", norm.ecat === 20, `实际 ${norm.ecat}`);
check("ecat 可以设到 1ms", normalizeRefreshMap({ ecat: 1 }).ecat === 1);
check("ecat 的 0/负数被抬到 1ms", normalizeRefreshMap({ ecat: 0 }).ecat === 1);
check("ecat 的 -5 被抬到 1ms", normalizeRefreshMap({ ecat: -5 }).ecat === 1);
check("ecat 的 20ms 合法(下限 6ms,不再被抬到 50)", norm.ecat === 20, `实际 ${norm.ecat}`);
check("ecat 可以设到 6ms", normalizeRefreshMap({ ecat: 6 }).ecat === 6);
/* 存量缓存里还留着旧的 1ms 档:读到就按新下限抬起来,不能原样放行 */
check("存量 1ms 被抬到 6ms(绘制上限之上没有消费者)",
normalizeRefreshMap({ ecat: 1 }).ecat === 6,
`实际 ${normalizeRefreshMap({ ecat: 1 }).ecat}`);
check("ecat 的 0/负数被抬到 6ms", normalizeRefreshMap({ ecat: 0 }).ecat === 6);
check("ecat 的 -5 被抬到 6ms", normalizeRefreshMap({ ecat: -5 }).ecat === 6);
check("wifi 的 1ms 仍被抬到 50(无线往返撑不住)",
normalizeRefreshMap({ wifi: 1 }).wifi === 50, `实际 ${normalizeRefreshMap({ wifi: 1 }).wifi}`);
check("wifi 的 20ms 也被抬到 50", normalizeRefreshMap({ wifi: 20 }).wifi === 50);
@@ -68,7 +72,7 @@ check("高于上限被压到 5000", normalizeRefreshMap({ wifi: 99999 }).wifi ==
check("ecat 高于上限同样压到 5000", normalizeRefreshMap({ ecat: 99999 }).ecat === REFRESH_MAX_MS);
check("字符串数字可用(localStorage 里存的是字符串)",
normalizeRefreshMap({ wifi: "300" }).wifi === 300);
check("ecat 字符串 \"1\" 可用", normalizeRefreshMap({ ecat: "1" }).ecat === 1);
check("ecat 字符串 \"8\" 可用", normalizeRefreshMap({ ecat: "8" }).ecat === 8);
const dirty = normalizeRefreshMap({ wifi: "abc", ecat: null });
check("脏值回落该链路默认(wifi)", dirty.wifi === 250, `实际 ${dirty.wifi}`);
check("脏值回落该链路默认(ecat)", dirty.ecat === 50, `实际 ${dirty.ecat}`);
@@ -97,7 +101,8 @@ check("正常取值", pickRefresh({ wifi: 300, ecat: 60 }, "ecat") === 60);
check("缺该链路 → 回落该链路默认(不是另一条的值)",
pickRefresh({ wifi: 300 }, "ecat") === 50);
check("map 为 null 不炸", pickRefresh(null, "wifi") === 250);
check("ecat 取出 1ms 原样保留(不再被抬到 50)", pickRefresh({ ecat: 1 }, "ecat") === 1);
check("ecat 取出 8ms 原样保留(不再被抬到 50)", pickRefresh({ ecat: 8 }, "ecat") === 8);
check("ecat 取出旧的 1ms 抬到下限 6ms", pickRefresh({ ecat: 1 }, "ecat") === 6);
check("wifi 取出 1ms 被抬到 50", pickRefresh({ wifi: 1 }, "wifi") === 50);
check("未知链路 id 回落到 wifi 默认(防御,不应出现)",
pickRefresh({}, "somethingnew") === 250);
@@ -105,24 +110,24 @@ check("未知链路 id 回落到 wifi 默认(防御,不应出现)",
/* ── 5. 隔离:本次改动的核心 ── */
section("[5] 两条链路互不污染");
const map = defaultRefreshMap();
/* 模拟:用户在 ECAT 下把刷新速度拉到 1ms(applyRefreshRate 只写当前链路那一份) */
map.ecat = 1;
check("改 ecat 到 1ms 后 wifi 仍是 250(不会把 WiFi 链路拖垮)", map.wifi === 250);
/* 模拟:用户在 ECAT 下把刷新速度拉到下限 6ms(applyRefreshRate 只写当前链路那一份) */
map.ecat = 6;
check("改 ecat 到 6ms 后 wifi 仍是 250(不会把 WiFi 链路拖垮)", map.wifi === 250);
/* 模拟:切回 WiFi,装载的应是 wifi 那一份 */
check("切回 wifi 装载 250 而非 1", pickRefresh(map, "wifi") === 250);
check("切回 wifi 装载 250 而非 6", pickRefresh(map, "wifi") === 250);
/* 模拟:在 WiFi 下改成 1000ms,再切去 ECAT */
map.wifi = 1000;
check("改 wifi 后 ecat 仍是 1ms(WiFi 的慢值不会浪费 ECAT 的低延迟)", map.ecat === 1);
check("切到 ecat 装载 1 而非 1000", pickRefresh(map, "ecat") === 1);
check("改 wifi 后 ecat 仍是 6ms(WiFi 的慢值不会浪费 ECAT 的低延迟)", map.ecat === 6);
check("切到 ecat 装载 6 而非 1000", pickRefresh(map, "ecat") === 6);
/* 存盘 → 读回一圈后仍各自独立(saveUiState/loadUiState 的往返) */
const roundTrip = normalizeRefreshMap(JSON.parse(JSON.stringify(map)));
check("存盘再读回:wifi 保留 1000", roundTrip.wifi === 1000);
check("存盘再读回:ecat 保留 1ms(不被 wifi 的下限 50 顺手抬高)",
roundTrip.ecat === 1, `实际 ${roundTrip.ecat}`);
check("存盘再读回:ecat 保留 6ms(不被 wifi 的下限 50 顺手抬高)",
roundTrip.ecat === 6, `实际 ${roundTrip.ecat}`);
/* ── 6. 不限速谓词 ──
* 1ms 档下节拍源必然比请求快,每拍都撞上"上一拍还在飞"。那是预期行为,
* 所以要据此关掉卡顿黄标;同时 1ms 硬算成 1000Hz 是谎报(浏览器实测约 125Hz)。 */
* 下限档(6ms)贴着往返耗时,节拍源仍会比请求完成得快,撞上"上一拍还在飞"是
* 预期行为,所以要据此关掉卡顿黄标;6ms 硬算成 166Hz 也偏乐观(实测 ≈160Hz)。 */
section("[6] 不限速谓词(关黄标 + 不谎报 Hz)");
check("阈值 20ms(50Hz):比浏览器实测每拍耗时(~8ms)宽裕,又远小于常用档",
UNTHROTTLED_MAX_MS === 20, `实际 ${UNTHROTTLED_MAX_MS}`);
@@ -135,7 +140,7 @@ check("ECAT 默认 50ms 是正常限速档(黄标与 Hz 显示都保留)",
check("WiFi 默认 250ms 是正常限速档", isUnthrottled(REFRESH_DEFAULTS.wifi) === false);
check("WiFi 下限 50ms 永远不进不限速区(该链路无此档)",
isUnthrottled(REFRESH_MIN_BY_TP.wifi) === false);
check("ECAT 下限 1ms 一定在不限速区", isUnthrottled(REFRESH_MIN_BY_TP.ecat) === true);
check("ECAT 下限 6ms 一定在不限速区", isUnthrottled(REFRESH_MIN_BY_TP.ecat) === true);
check("非数字不炸且判 false", isUnthrottled(undefined) === false && isUnthrottled(NaN) === false);
console.log(out.join("\n"));