mongona

mongona
-- --
正在获取天气

站点升级手记 10:一次看板娘事故,PJAX 页面切换为什么不能粗暴重建 Canvas

问题现象

升级过程中,站点的 Live2D 看板娘在某些页面切换后出现了一个很大的红色圆形,看起来像背景,也像模型左眼或某个部件跑到了身体后面。最开始直觉会怀疑 CSS:是不是伪元素、光环、粒子或者背景层没清干净?

检查后发现,容器背景是透明的,伪元素也已经被禁用,页面里没有红色 CSS 候选元素。真正的问题在 canvas 里面,也就是 Live2D 模型渲染结果本身。

根因:销毁重建触发贴图错乱

Gallery 页面为了不挡住相册和播放器,会隐藏看板娘。之前的实现是在进入 Gallery 时删除 Live2D 容器,离开 Gallery 后重新创建 canvas 并重新初始化模型。这个做法看似直接,但对 Live2D 这种有内部渲染状态的组件并不友好。

模型资源、纹理、事件和 canvas 生命周期并不是普通 DOM 那么简单。反复删除和重建,可能导致部件贴图错位、事件绑定重复或渲染状态异常。

  • CSS 背景透明不代表 canvas 内容正常。
  • PJAX 页面切换会让组件生命周期变复杂。
  • 对音频、canvas、Live2D 这类组件,要优先保留实例。
  • 隐藏应该是 display none,而不是 removeChild 后重新 new。

最终修复

修复方式是:Gallery 页仍然隐藏看板娘,但不再销毁容器和 canvas,只给容器加一个 `is-pio-suspended` 状态;离开 Gallery 后移除这个状态,恢复同一个 Live2D 实例。这样既不会挡住 Gallery,也不会触发模型重建导致贴图错乱。

这个问题给我的提醒是:现代前端里,页面不是单纯的 HTML 替换。只要涉及持久播放器、canvas、WebGL、Live2D、评论系统或第三方 SDK,都需要明确生命周期,不能用粗暴的 DOM 替换解决所有问题。

请我喝咖啡

感谢支持,我会继续更新更有用的技术内容。

打赏二维码
请我喝咖啡 如果内容帮到了你,可以赞赏支持继续更新。
Category
Tags
Site statistics

本站现有文章164篇,共被浏览130669

本次响应耗时: 0.272s

当前来路IP: 216.73.217.18   403 Forbidden

您是本站第: 235393 位访客!

本站已苟活: 

Commercial
开发者产品赞助位开放

适合 AI 工具、云服务、课程、开源项目和招聘团队。

查看合作方案
All hots
Article archiving
Mongona Radio
等待播放