HTML5 canvas strokeStyle 之间的表现 rgba/globalAlpha

HTML5 canvas performance between strokeStyle rgba/globalAlpha

如果想使用具有透明度的颜色,最好使用什么来获得更好的性能

使用 rgba 或 globalAlpha 的 strokeStyle?

第一个:

var rChannel = 0;
var gChannel = 0;
var bChannel = 0;
var aChannel = 0.5;
context.strokeStyle("rgba(" + rChannel + "," + gChannel + "," + bChannel + "," + aChannel + ")");

第二个:

context.globalAlpha = "0.5";

没有,至少没有引起注意。无论您为全局 alpha 使用什么值,混合和合成过程都是相同的(假设生成的背景 alpha 永远不会是 1)。

影响性能的是您选择的 混合 模式(lighter 又名 plus 除外,因为这是复合操作)(混合模式,可分离和不可分离,如屏幕、覆盖、颜色、色调等也通过 globalCompositeOperation) 设置,以及关闭背景 alpha(见下文)。

所有浏览器都使用所谓的 Porter Duff Compositing Operators。这对所有合成类型使用相同的公式:

co = αs x Fa x Cs + αb x Fb x Cb

或:

color out = alpha source x Fa x Color Source + 
            alpha background (or destination) x Fb x Color Background

Fa/b 因使用的运算符而异,例如对于 source-over 它们将是:Fa = 1; Fb = 1 – αs.

然后结果是 "mixed" 使用全局 alpha(Cb = 包含背景 alpha)回到 canvas。

Cr = (1 - αb) x Cs + αb x B(Cb, Cs)  // B() = Blending mode

因此,无论您为 alpha 使用什么值,像素都是 运行 通过相同的公式,不会产生任何性能差异(这些公式通常合并为一个步骤;对于混合,仅考虑交叉区域)。

理论上,如果背景 alpha 为 1,则不需要最后的混合阶段,但由于您使用的 alpha 不是 1 用于颜色或 globalAlpha,因此需要 "mixed".

然而,还有一个鲜为人知的 2D 上下文选项参数(CanvasRenderingContext2DSettings,请参阅接口定义下方的绿色框):

var context = canvas.getContext("2D", {alpha: false});

如果您不需要 canvas 背景不透明,则关闭背景 alpha 可以大大提高性能。

老Opera支持它有一段时间了,Chrome(或者是FF...记不清了)最近才开始支持它和FF(或Chrome)/ IE 稍后会支持它(如果不支持它会被忽略,所以提供它没有坏处)。

有关 compositing/blending 的浏览器实现的更多详细信息,请参阅 this link

希望这能提供一些输入(免责声明:已经晚了,而且还不太了解长公式,所以我明天会仔细检查)。