docs: 新增 .qoder Repowiki 知识库文档
This commit is contained in:
@@ -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"));
|
||||
|
||||
Reference in New Issue
Block a user