-1

有没有办法在后台访问 HTMLCanvas元素DrawingContext2D saverestore堆栈?

目的是为了save一个基本状态,clip它的一个区域,允许一些操作发生,这些操作可能适用clip于不确定的顺序(即saverestore可能有save2-3 个状态到堆栈并且永远不会恢复它们,或者它可能会restore多次,并且save在返回父函数之前丢失原始状态,然后父函数将尝试进入restore堆栈中不再存在的状态。)

我宁愿在没有包装类的情况下执行此操作,DrawingContext2D因为 JavaScript 在每个函数调用时都会变慢一些,并且渲染往往是时间敏感的。

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

4

1 回答 1

2

有没有办法在后台访问 HTML Canvas 元素的 DrawingContext2D 保存和恢复堆栈?

状态堆栈是内部的,不会以任何方式暴露。您可以通过将自己的调用提升为上下文原型上的包装器来利用保存/恢复调用本身(例如,参见显示一种方法的这个答案)并从那里跟踪计数 - 这不会影响其余的上下文性能-明智的。当然,您仍然无法访问内部。但是会有一些警告,例如您如何区分呼叫源以及您如何知道何时应允许或不允许呼叫(呼叫restore()多于save()顺便说一句。安全)。

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

主要障碍是使用剪辑时。目前没有办法在不使用保存/恢复(或设置上下文大小)的情况下重置剪辑 -标准包括它,但目前似乎没有任何供应商支持它。但是,在许多情况下,您可以通过使用合成来代替剪辑,有时与离屏画布结合使用。

于 2017-02-21T07:27:08.500 回答