海边

2026-10-20

维护记录

完成的工作

  • 左下角徽标整体重做为待机屏保:页面 10 秒无输入后,全视口固定画布淡入,用 WASM 粒子把随机一张背景 cutout 按 2px 网格慢慢拼出来 ✅
  • 粒子改成 1px 方块 + 1px 缝隙(sizeRatio 0.55、size_mode 1):整幅图变成细密的点阵,落定后由 float_on() 持续漂浮,不再冻结 ✅
  • 新增 Rust 指针透明场:pointer_set(x, y, radius) 让半径(默认 240 CSS px)内的粒子逐帧淡到透明(0.12/帧,内 60% 全透、边缘线性),pointer_clear() 让它们淡回 1;粒子本身从未删除,目标位 / 漂浮状态都保留,所以鼠标移开就恢复 ✅
  • 鼠标经过同时调用 burst() 把附近粒子向外推开;指针移开 / 离开窗口 / 切后台时 pointer_clear(),粒子边飞回边淡入,形成「散开 → 透明 → 恢复」的循环 ✅
  • 只有点击 / 按键才退出:pointermove 只负责透明化 / 飞散,不关闭;wheel / touchmove 被 wake 层吞掉;第一次点击的 click 由 capture 监听吞掉,避免误点链接 ✅
  • 背景是毛玻璃:.page-bg 半透明底色 + backdrop-filter: blur(10px),原博客内容从粒子缝隙 / 透明洞里透出来;canvas 背景全透明,只画人物,不再叠一张更大的模糊图 ✅
  • 渲染尺寸按预算封顶:backing store 用 CSS 像素(不乘 dpr),总像素上限 1.5MP;1440×900 是 324,000 个 2px 格子,但透明底 cutout 只有人物覆盖的格子会成为粒子(实测 5.3–7.4 万颗,随图不同),5.2MB/帧、30fps 约 156MB/s ✅
  • 大屏自适应:blockCss = max(2, sqrt(视口面积 / 400000)),1920 约 2.3px、2560 约 3.0px、4K 约 4.6px ✅
  • 新增 Rust assemble_on(frames):按 hash01(i) 在窗口内随机放行粒子,未放行不画、不跑物理;放行后从 build() 的随机散布飞回目标位 ✅
  • JS 用固定 30Hz 累加器调 tick();漂浮让画面持续运行到退出 / 切后台,不再有落定冻结 ✅
  • 降级:prefers-reduced-motion 只加载图片、10 秒后淡入静态图;saveData 不进入;无 JS / wasm 失败时页面完全不受影响 ✅
  • 移除旧徽标的 at-bottom 门控、双击切回图片、首屏 <img> 兜底、逐行显现 / 待机水波状态机;baseof.html 不再注入 .js 与 2 秒兜底定时器 ✅
  • 图片 / CSS 改成根相对路径,本地 127.0.0.1 / localhost / 正式站都同源,不再受 Hugo server 热重载时 baseURL 回退影响 ✅
  • 更新 AGENTS.md、themes/self/README.md;重建 particles.wasm + particles.sha256(33,944 字节)与 Tailwind 产物 ✅
  • ?pt-bg=now 可跳过 10 秒等待;html[data-pt-engine] / [data-pt-particles] / [data-pt-block] / [data-pt-size] 方便排查 ✅

遇到的问题

  • 2px 下粒子数会随人物细节增长,但透明底只采样人物,实测 5.3–7.4 万颗,没有触发 maxParticles 退化 ⚠️ - 保留 maxParticles 180k 作为安全阀。
  • 毛玻璃的暗色不能用 --bg(它始终是亮色预设,暗色实际由 body::before 的 bg-black/85 叠加)⚠️ - .dark .page-bg 单独给 #0b0b0b/55%,手机 blur 降到 6px。
  • 一开始做成「擦掉后永久消失」,反馈希望是透明 + 移开恢复 ⚠️ - 把永久 dead 改成逐粒子 fade alpha,pointer_clear() 后淡回 1;粒子从未删除。
  • 图片 / CSS 原先拼 site.BaseURL / .Permalink,Hugo server 热重载后回退成生产域名,本地资源变成跨域、getImageData taint → engine: error ⚠️ - 统一改根相对路径,本地与生产都不再依赖 baseURL。
  • 源图底部自带署名 / 水印,全屏后比在角落里更显眼 ⚠️ - 保留完整构图;介意可在 compose() 里裁掉底部约 4% 或加底部渐隐。

下次建议

  • 如果觉得 240px 的透明洞太大或太小,调 scatterRadius;想改淡入淡出速度,调 wasm/particles/src/lib.rs 里 tick() 的 0.12/帧。
  • 在真实 Retina 屏上确认 1px 粒子的观感:backing 仍是 1x,方块会略柔;需要更锐可在落定后补一帧 dpr2 重绘。
  • 观察 10 秒是否过短:读文章时 10 秒不动鼠标很常见,若觉得打断阅读,可把 idleMs 调到 20–30 秒,或只在首页启用。
  • 引擎里的 wipe_on / ripple_on 目前站点已不再使用(/particles/ 只用 settle());确认以后不需要的话可以再删一轮,进一步缩小 wasm。