From bf98a49a79c2527fee3819894d6456904d507ebe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B4=AE=E7=94=9F=EF=BC=88=E5=AD=90=E8=99=9A=EF=BC=89?= <2234839456@qq.com> Date: Sat, 15 Aug 2026 19:13:36 +0800 Subject: [PATCH] =?UTF-8?q?perf(leafer-x-webfont):=20=E6=8C=89=20family=20?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E6=8C=87=E7=BA=B9=E7=9F=AD=E8=B7=AF=E6=97=A0?= =?UTF-8?q?=E5=8F=98=E5=8C=96=E7=9A=84=20loader.update?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 拖拽/缩放等操作每帧触发布局事件,防抖后仍会全量重扫并逐 family 调用 loader.update。新增 committed 指纹表:本轮收集的字符集与上次 提交一致时跳过 update,无文字变化的交互中 update 调用归零。 存字符串本身而非 hash,比较为 memcmp 级且零碰撞。 --- packages/leafer-x-webfont/src/index.ts | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/leafer-x-webfont/src/index.ts b/packages/leafer-x-webfont/src/index.ts index f93ac0e..59d4dce 100644 --- a/packages/leafer-x-webfont/src/index.ts +++ b/packages/leafer-x-webfont/src/index.ts @@ -9,7 +9,7 @@ * * 去重 / 并发池 / 失败字符记忆 / provider 抽象全部在 webfont-sdk 引擎层实现, * 本插件只做 Leafer 桥接: - * - 树扫描(walk)聚合同 family 字符 + * - 树扫描(walk)聚合同 family 字符,按 family 内容指纹短路无变化的重算 * - property.change + layout.end 事件订阅(防抖) * - fontFamily 规范化改写('xx.ttf' → 'xx',canvas font 串要求合法标识符) * - 片段就绪后 forceRender @@ -88,6 +88,13 @@ export class WebFontPlugin { private mode: WebFontFontFaceMode /** family -> 增量加载器(由 SDK 管理) */ private loaders = new Map() + /** + * family -> 上次提交给 loader 的字符集串(内容指纹)。 + * 拖拽/缩放等操作每帧触发布局,内容没变时靠它短路掉 + * 「字符集收集 + loader.update 内部 diff」这两个大头,update 调用归零。 + * 存字符串本身而非 hash:比较成本是 memcmp 级且零碰撞风险 + */ + private committed = new Map() /** 防抖定时器 */ private debounceTimer: ReturnType | null = null /** 解绑事件用的 id 列表 */ @@ -193,8 +200,12 @@ export class WebFontPlugin { walk(this.leafer) - for (const [, { loader, chars }] of groups) { - loader.update(charsToString(chars)) + for (const [family, { loader, chars }] of groups) { + /** 内容指纹短路:本轮收集到的字符集与上次提交一致(拖拽等无文字变化的场景)时,跳过 loader.update */ + const collected = charsToString(chars) + if (this.committed.get(family) === collected) continue + this.committed.set(family, collected) + loader.update(collected) } } @@ -307,6 +318,7 @@ export class WebFontPlugin { this.offEvents = null for (const loader of this.loaders.values()) loader.dispose() this.loaders.clear() + this.committed.clear() this.leafer = null } }