From eb3ed06d412e9f46bbf40d3b28fd003013b51024 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: Fri, 24 Jul 2026 20:44:55 +0800 Subject: [PATCH] =?UTF-8?q?perf(glyf):=20simple=20=E5=AD=97=E5=BD=A2=20fas?= =?UTF-8?q?t-path=20glyfObj=20=E6=94=B9=E5=AF=B9=E8=B1=A1=E5=AD=97?= =?UTF-8?q?=E9=9D=A2=E9=87=8F=E6=B6=88=E9=99=A4=E9=9A=90=E8=97=8F=E7=B1=BB?= =?UTF-8?q?=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit glyf.read 的 simple 字形快路径原用 `var glyfObj = {}` 后逐个赋值 9 个属性 (xMin/yMin/xMax/yMax/_origBuf/_origOff/_origLen/_numContours/_totalPoints), 每个字形产生 9 次隐藏类迁移。改为对象字面量一次性创建所有属性,V8 分配稳定隐藏类 (无迁移),且 numberOfContours>0 / =0 统一形状(_numContours 直接用值, _totalPoints 用三元表达式)。 千字文(129 simple 字形)Font.create best-of p50 约 -3%(多轮 0.1527→0.1479)。 5 字体 woff2 sha 逐字节一致,SSIM 全部不变(仅对象创建方式变化,属性集完全相同)。 Co-Authored-By: Claude Opus 4.8 (1M context) --- vendor/fonteditor-core/lib/ttf/table/glyf.js | 27 ++++++++------------ 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/vendor/fonteditor-core/lib/ttf/table/glyf.js b/vendor/fonteditor-core/lib/ttf/table/glyf.js index a41c9b1..6667e73 100644 --- a/vendor/fonteditor-core/lib/ttf/table/glyf.js +++ b/vendor/fonteditor-core/lib/ttf/table/glyf.js @@ -100,22 +100,17 @@ var _default = exports.default = _table.default.create('glyf', [], { * 优化313: 不再分配 endPtsOfContours 数组——_totalPoints 只需最后一个 endPt。 * 优化314: 原始字节引用展平到 glyfObj(_origBuf/_origOff/_origLen), * 省掉每个 simple 字形的 _origGlyfRef 子对象分配。 */ - var glyfObj = {}; - glyfObj.xMin = view.getInt16(vOff + 2, false); - glyfObj.yMin = view.getInt16(vOff + 4, false); - glyfObj.xMax = view.getInt16(vOff + 6, false); - glyfObj.yMax = view.getInt16(vOff + 8, false); - glyfObj._origBuf = fullBuf; - glyfObj._origOff = fullBufOff + gStart; - glyfObj._origLen = gEnd - gStart; - if (numberOfContours > 0) { - glyfObj._numContours = numberOfContours; - /** 最后一个 endPt 在 vOff + 10 + (numContours-1)*2,+1 即总点数 */ - glyfObj._totalPoints = view.getUint16(vOff + 10 + (numberOfContours - 1) * 2, false) + 1; - } else { - glyfObj._numContours = 0; - glyfObj._totalPoints = 0; - } + var glyfObj = { + xMin: view.getInt16(vOff + 2, false), + yMin: view.getInt16(vOff + 4, false), + xMax: view.getInt16(vOff + 6, false), + yMax: view.getInt16(vOff + 8, false), + _origBuf: fullBuf, + _origOff: fullBufOff + gStart, + _origLen: gEnd - gStart, + _numContours: numberOfContours, + _totalPoints: numberOfContours > 0 ? view.getUint16(vOff + 10 + (numberOfContours - 1) * 2, false) + 1 : 0, + }; glyphs[index] = glyfObj; } else { /* compound 字形:完整 parse(component glyphIndex 后续要重映射) */