Canvas 调了 save restore 仍多画一条线,怎样分开路径与绘图状态
save 与 restore 保存绘图状态,却不把当前默认路径当成状态栈的一部分。需要开始一条独立路径时调用 beginPath;否则下一次 stroke 可能把旧段也用新颜色重新描一遍。
用旧线段变色揭露路径残留
夹具先画一条红色横线,再save、修改颜色并restore,随后用蓝色画第二条线。没有beginPath的组会把旧红线也描成蓝色;有beginPath的组旧线保持红色。脚本读取两条线中部RGBA作判断,避免只看画面时把叠描当作显示器色差或缩放模糊。
状态恢复与路径清空分别执行
restore确实会把填充、描边等状态恢复,因此附件另外读取restored样式,确认它回到红色。接下来显式设蓝用于第二次stroke;这一步与路径是否包含第一段无关。若把restore后颜色恢复正确误当路径也恢复,复杂互动涂鸦就会出现越画线越多、后画颜色覆盖前画线条的现象。
beginPath不会擦掉已经画好的像素
开始新路径只是清空当前默认路径,第一条红线已经成为位图像素,仍留在画布上。clearRect才涉及清像素,但不会替你定义下一条路径。对于需要反复绘制且独立保存的形状,可以使用Path2D表达;本例故意使用默认路径,让状态栈边界清楚,不能把结论简化成所有路径对象都由beginPath管理。
放进绘图循环前先看所有权
如果多个绘图函数共用同一个context,应约定每个函数是否自己beginPath以及如何save/restore。不要让一个函数留下半条路径,另一个函数在不知情时stroke。附件使用Canvas2D的reset重新开始两组实验,所测Chromium具备该接口;目标旧运行时若无reset,可通过新建画布或尺寸重置建立相同前提,再执行后续专项步骤。
不要用clearRect替代beginPath
clearRect清的是当前位图像素,旧路径仍可在下一次stroke时重新出现。若动画每帧先clearRect却不beginPath,线段集合仍可能越积越多,最后看起来像清屏无效。每帧或每个独立对象先建立自己的路径,再按需要stroke或fill,能把像素擦除与几何命令分清。复杂形状可另存Path2D,本题仅验证默认路径的生命周期。
下载并复现
下载原创HTML夹具、独立验证程序、本次执行记录和依赖与运行说明,放在同一目录。安装Playwright 1.58.0及其Chromium后运行 python verify.py;程序使用两个随机本地端口,自动关闭浏览器与服务,不请求外网或业务接口。
本次实际环境为Python 3.12.4、Playwright 1.58.0、Chromium 145.0.7632.6。Canvas2D或WebGL1页面API与像素读取;非指针输入、非实体GPU性能测量。断言已通过;完整事件和数值保留在执行记录,不能把它改名后当目标展项测量。
Canvas题限定2D上下文,WebGL题限定WebGL1;启动使用ANGLE SwiftShader软件后端参数,实际renderer可见对应执行记录。软件后端的像素结果不代表实体显卡性能、驱动稳定性或跨浏览器一致性。
继续核查与一级出处
基础背景见互动引擎怎么选?雷达/体感/触摸触发方式对比与选型清单。路径栈边界与整个上下文尺寸重置是两种不同机制,可继续用Canvas 改完 width 后颜色和变换都丢了,怎样验证上下文重置取证;相关工程入口在专题与产品对接说明。
- 当前默认路径不属于save/restore绘图状态:2026-10-24已联网读取一级来源;WHATWG HTML Living Standard,读取页标记2026-10-22更新。
留言讨论
评论发布后会被人工复核,违规内容将被删除。
如果发表没有反应,可以前往联系我们告诉我们。