访问 HTML5 Canvas 的 DrawingContext2D Save/Restore 堆栈?

Accessing the HTML5 Canvas's DrawingContext2D Save/Restore Stack?

有没有办法访问 HTML Canvas 元素的 DrawingContext2D saverestore 堆栈?

目的是save一个基本状态,clip它的一个区域关闭,允许进行一些可能适用的操作clipsave , restore 具有不确定的顺序(即某些东西可能 save 2-3 个状态到堆栈并且永远不会恢复它们或者它可能 restore 多次并失去之前的原始 save 状态返回到父函数,然后父函数将尝试 restore 堆栈中不再存在的状态。)

我更愿意在 DrawingContext2D 周围没有包装器 class 的情况下执行此操作,因为 JavaScript 每次函数调用都会变慢一点,并且渲染往往对时间敏感。

能够限制被调用函数中可能的 restore 调用次数而不依赖被调用函数来维持该限制也很棒。

Is there a way to access the HTML Canvas element's DrawingContext2D save and restore stack under the hood?

状态堆栈是内部的,不会以任何方式暴露。您可以通过在上下文 prototype 上将您自己的调用提升为包装器来利用 save/restore 调用本身(例如,参见 this answer 显示了一种方法)并从那里保持计数跟踪 - 这不会影响上下文的其余部分 performance-wise。当然,您仍然无法访问内部结构。但是会有一些注意事项,例如您如何区分呼叫源以及您如何知道何时应该允许或不允许呼叫(顺便说一句,呼叫 restore() 多于 save() 是安全的)。

但是,如果可能的话,我会完全避免使用 save/restore。大多数状态都可以通过仅跟踪或设置您实际需要的状态(包括转换)来跟踪 "manually"(setTransform() 在这里非常方便)。

主要障碍是使用裁剪。目前没有使用 save/restore(或设置上下文大小)的方法来重置裁剪 - standard includes it 但目前似乎没有任何供应商支持它。但是,在许多情况下,您可以使用合成代替裁剪,有时与 off-screen 画布结合使用。