Skip to content

v2.1.18

Choose a tag to compare

@Glittering Glittering released this 25 Oct 12:03
· 76 commits to main since this release

v2.1.19 — 每次加载"闪一下 1/4 大小":真因是自检截图的 clip.scale

这次抓到了实锤,不是推测。

证据

系统录屏是变帧率编码,一帧(16ms)的闪现会被直接丢掉——这就是前几轮我"录不到"的原因。
换成 avfoundation 固定 60fps 后,一次就抓到了:

帧 137–139 / 223–225 / 325–327 / 426–428   (每组 3 帧 ≈ 50ms)
内容宽度 = 25%  ←  正好 1/4,页面被画进左上角
每次刷新出现一组,时机都在"刷新后约 500ms"

真因

白屏自检(v2.1.13 引入)为了省 CPU,把缩放参数交给了合成器:

Page.captureScreenshot({ clip: { x:0, y:0, width, height, scale: 0.25 } })

带 clip.scale 的截图会让 Chromium 按该比例临时重建 surface。自检恰好跑在
did-finish-load + 450ms,那几十毫秒里窗口往往正在重新合成 —— 于是把这张 1/4 的图
贴上去 1–3 帧,再恢复。尺度(25%)和时机(+500ms)两处都对得上,而且这个自检
正是 v2.1.13 加的,"加载时闪一下"也是从那时开始出现。

改法

  1. 取帧优先 webContents.capturePage() —— 不碰 CDP 的 Page 域、没有 capture 模式;
    拿不到(窗口被遮挡会返回空图)再用不带 clip/scale 的 captureScreenshot 兜底;
    两者都拿不到 = no-frame,不判缺陷。
  2. 缩放只许我们自己用 nativeImage.resize({width:240}) 做,绝不把缩放参数交给合成器。
  3. 加固 _auditLayout:几何不一致时先等 120ms 复核,仍不一致才纠正——窗口刚变化的那
    一两百毫秒里两个值会短暂对不上,此刻"纠正"等于把视图改成中间尺寸。

验证

npm run paint 23/23(blank-with-text 仍能报出来)、npm run layout 25/25、单测 970。

渠道

GitHub Release(含 dmg)· npm · MCP registry · /Applications —— 全部 2.1.19。