Canvas 调了 save restore 仍多画一条线,怎样分开路径与绘图状态

2026-10-24

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 后颜色和变换都丢了,怎样验证上下文重置取证;相关工程入口在专题与产品对接说明。

需要展厅软硬件方案或定制开发?

加微信,把这一页发到你手机上

扫码加站长企业微信,会自动把这一页的链接发给你。问软件授权、报价,或者现场遇到问题,也可以直接聊。

去留微信

留言讨论

评论发布后会被人工复核,违规内容将被删除。

    还没有人评论,来说说你的看法

    如果发表没有反应,可以前往联系我们告诉我们。

    这个页面有问题?

    提交时会附带当前页面地址和浏览器信息,帮助我们定位问题。不填联系方式即为匿名。