为什么不能在后台使用WebGL进行canvas 2D上下文?

时间:2020-05-09 15:07:15

标签: canvas webgl

我已经使用了很多画布2D上下文,并且最近也开始学习一些WebGL。

当我正在编写有关如何从WebGL中的2D上下文实现context.drawImage()的教程时,标题中的问题浮现在我身上。结果是类似context.drawImage()的东西(至少非常接近),但是由于使用WebGL而变得更快。

从理论上讲,我相信canvas 2D上下文中的所有内容都可以在WebGL中进行仿真,从而可以大大提高性能。那为什么不呢?

我绝对不是在谈论更改任何语法或任何内容。我真的很喜欢2D上下文的简单性。但是,为什么浏览器不执行本教程的内容呢?

我了解WebGL并非到处都有完整的支持,但是我仍然认为,如果可能的话,可以使用常规2D上下文作为后备。

1 个答案:

答案 0 :(得分:2)

Canvas2D确实在引擎盖下使用了与WebGL基本相同的API。

如果您在WebGL中实施整个Canvas 2D规范,则速度可能会相似。 Canvas支持诸如使用patterns进行绘制,使用gradientsclipping paths进行绘制,具有任意宽度,末端,连接等的线条...将所有这些功能添加到在WebGL中实现的Canvas和它的速度可能差不多。

WebGL 可以更快的原因是(a)因为您可以选择不实施将不使用的功能,以及(b)因为可以知道自己只会使用而可以进行优化使用某些功能。

作为一个简单的示例,您可以在画布中使用drawImage(someImageElement, x, y)绘制图像。在WebGL中,首先必须根据图像创建纹理,然后使用该纹理进行绘制,以便手动管理该纹理。画布实际上必须做同样的事情。它必须将图像加载到纹理中才能进行绘制(假设它通常是基于GPU的画布)。但是,不知道是否要再次绘制图像,这样就不能永远将图像保留为纹理。最简单的实现是将图像复制到纹理,绘制,然后删除纹理。我怀疑这是画布的功能,我猜测它是否具有从图像生成的纹理缓存。但是,要点是,它的纹理管理是隐式的,而在WebGL中是显式的,因此您必须自己手动管理纹理。

另一个例子是绘制形状。在WebGL中,通常需要在初始化时确定要绘制的形状,设置绘制它们所需的所有数据,然后在渲染时仅使用已经设置的形状。在Canvas中,动态绘制形状更为常见,这意味着每次要绘制形状时,都使用moveTolineTo命令绘制形状,这可以有效地完成您每次的所有工作呈现,而不是像WebGL那样仅在初始化时执行。

区别在于,它们加起来比画布更容易,而webgl更快。

注意:有人尝试在WebGL herehere中实现canvas2d

相关问题