是否有任何理由在2D游戏/应用程序中使用WebGL而不是2D Canvas?


112

除了性能之外,是否有其他原因需要在2D游戏/应用程序中使用WebGL而不是2D-Canvas ?

换句话说,WebGL提供了哪些2D功能,而2D-Canvas无法轻松实现这些功能?


5
顺便说一句:虽然您不能在同一画布上使用2d和3d上下文API,但是仍然可以通过使用多个画布将它们组合在一起。WebGL可以将2d画布用作纹理,而2d画布可以将WebGL画布用作drawImage的源。
菲利普2014年

Answers:


83

从另一个角度看这个问题:
开发人员如何选择一种技术而不是另一种?

  • 更好地集成到他们已经构建的系统中
  • 更容易使用
  • 是比较快的
  • 具有更多功能或更适合他们的需求
  • 成本
  • 与平台无关

因此,我将讨论关于这些品质的canvas API和webGL API之间的区别。


canvas和webGL都是JavaScript API。关于集成(绑定),它们几乎相同。它们都受到许多库的支持,这些库可以加快编码速度。不同的库为您提供了不同的组织代码的方式,因此库的选择决定了绘图API的结构,但仍然几乎是同一件事(其余代码如何与之绑定)。如果使用库,编写代码的难易程度取决于库本身。

如果您从零开始编写代码,canvas API更容易学习和理解。它只需要很少的数学知识,并且开发快速而直接。

使用WebGL API需要强大的数学技能和对渲染管道的全面理解。具有这些技能的人更难找到,生产速度较慢(由于此类代码库的大小和复杂性),因此成本更高。

WebGL更快,并且具有更多功能。毫无疑问。它是本机3D API,可让您完全访问渲染管道,代码和效果执行得更快,并且更“可调整”。使用webGL确实没有限制。

canvas和webGL都是html5好东西。通常,支持一个的设备将支持另一个。

因此,总结一下:

  • 合并绘图API代码和其余(集成):相似
  • 使用方便:
    • (带库)canvas = webGL
    • (从头开始)webGL <<画布
  • 速度:webGL>画布
  • 功能:webGL>画布
  • 成本:webGL更加昂贵
  • 平台:非常相似

希望这可以帮助。

PS公开讨论。


@Abstract,关于Web GL的好的教程在哪里,需要多少小时?
Pacerier

1
@Pacerier只是用谷歌搜索它,前几条命中可能已经足够好了。但是,要想熟练掌握Webgl和图形编程,通常需要数周甚至数月的时间,而要真正变得出色,则需要数年的时间。学习API所需的不仅仅是随机的“库”,而是这样。
抽象算法

@AbstractAlgorithm,我的意思是,如果您是编程画布的高手,切换到Web GL需要花费几个小时?
佩里耶

@Pacerier取决于开发人员,并且正如Abstract所说的那样,涉及开发人员的数学技能。确实无法量化。
scrappedcola

32

最大的优势是管道的可编程性和性能。例如,假设您正在一个上方绘制两个框,而另一个被隐藏,则某些GL实现具有丢弃该隐藏框的范围。

至于比较,由于这里没有快速创建表格的方法,因此我只上传了下面比较表的图片。添加Three.js仅出于完整性考虑。

表


关于“某些GL实现具有丢弃隐藏框的范围”,但是您无法检测到JS中该被覆盖的部分,因此不重绘不需要的内容吗?
Pacerier

16

从我自己的应用程序的经验来看,图形着色器一直是我需要支持WebGL的唯一原因之一。易用性对我几乎没有影响,因为可以使用three.js将两个框架抽象化。假设我不需要着色器,则允许使用任何一个框架来最大化浏览器/机器的支持。


16

WebGL提供2D画布不提供的2D功能?最大的恕我直言是图形硬件上的可编程片段着色器。例如,在WebGL中,您可以在3D硬件上的着色器中实现Conway的生命游戏:

http://glslsandbox.com/e#207.3

这种2D显示只能在具有2D画布的CPU上运行,而不能在GPU上运行。所有的计算都将用JavaScript实现,即使在网络工作者的帮助下,也不会像GPU那样并行。当然,这只是一个示例,可以使用着色器实现各种有趣的2D效果。


2
因此,与canvas相比,WebGL或多或少会对OS造成负担?
Pacerier

我很好奇所有画布最终是否仍会进行webgl;如果它使用预编译的通用用例webgl,它将比直接webgl更有效;或者如果它不以任何方式与opengl接口,除非您使用webgl。
德米特里(Dmitry)

1
@Dmitry是个好问题,不同的浏览器可以自由采取不同的方法来解决该问题。但是,无论它们如何加速Canvas 2D API,Canvas 2D API本身都不提供可编程着色器或顶点阵列缓冲区。这是一个“聊天” API(每个绘制的元素一个JavaScript到本地调用),而WebGL的API允许批量数据加载和基于GPU的自定义处理。
emackey

14

好吧,性能将是最大的原因之一,因为在编写游戏代码时,它必须要快。但是,还有其他一些原因可能导致您需要在画布上选择WebGL。它提供了对着色器,照明和缩放进行编码的可能性,如果您正在使用商业游戏应用程序,则这非常重要。在50个左右的精灵之后,画布也会变得不稳。


尤其是在像Android平板电脑这样的设备上,CPU在javascript中会快速过载,使用WebGL的主要原因是将渲染负载转移到GPU上。
Curtis

1
@ Xk0n,Re“将可能性提供给着色器,照明和缩放编码”,但是它难道就不依赖于GPU了吗?
Pacerier

您仍然可以在2D画布上下文中使用setTransform进行缩放。从Sprite表格缩放时,我一直很难在2D画布上进行纹理渗入,这就是为什么我转向WebGL的原因。我看到了一个教程,该教程可以阻止最近的邻居采样从源rect之外移出,这应该可以解决我的出血边缘问题。
弗兰克

7

使用Canvas不能做的事,不能使用webGL来做:画布允许使用get / putImageData压碎字节,并且您可以使用webGL以编程方式绘制线条,圆圈。
但是,如果您要绘制一些图形,以及60 fps的效果,则性能差距是如此之大,以至于画布无法在WebGL上正常运行。性能是根本特征。

但是webGL的编程非常复杂:看看canvas是否足以满足您的需求,或者寻求一个可以减轻痛苦的库...
其他缺点:它在IE(但有什么用)和某些移动设备上不起作用。
有关兼容性,请参见此处:http : //caniuse.com/webgl


7

正如您特别想要一些经典的2d物件无法在画布上正常工作:

  • 颜色转换(例如闪烁精灵)
  • 重复位图填充
  • 在旋转下平铺地图(在画布下,某些实现将创建接缝)
  • 深度分层(非常依赖于实现)
  • 乘法或加法混合

...但是您当然可以访问像素,因此您可以手动执行任何操作,包括上述操作。但这可能确实非常缓慢。您可以使用Mesa openGl脚本来在理论上渲染到画布。

使用webGL的另一个重要原因是将结果移植到其他地方非常容易。这也使该技能更有价值。

使用画布的原因是它仍然得到更好的支持,并且如果您学会逐像素做事,这也是非常有价值的一课。


顺便说一句WebGL是多线程的吗?您是否可以有两个线程同时绘制屏幕的两个部分?
Pacerier

我认为答案是“是与否”,因为Web浏览器本质上是单线程的,因此将要呈现的数据复制到GPU并不是多线程的。但是,一旦着色器开始渲染,您就在使用图形卡的大规模并行化,这实际上是一次绘制到屏幕的多个部分。如果我错了,请纠正我。
肯特·韦格尔

2

由于WebGL是特别新的技术,而HTML5 canvas更加成熟,因此您要使用的内容取决于用户。如果您认为您的用户将使用移动设备,那么我建议使用HTML5画布,但是如果您想要更好的2D渲染,则可以使用WebGL。因此,您可以做的是,如果将其用于带HTML5的移动渲染上,否则,如果它们在支持WebGL的平台上使用。

例如:

 if (window.WebGLRenderingContext) {
     webGLcanvasApp()
         } else if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {
     html5CanvasAppFMobile()
    } else {
    html5CanvasApp()
    }

资料来源:
检测WebGL支持的正确方法?
在jQuery中检测移动设备的最佳方法是什么?


1

如果没有GPU,WebGL将无法使用。
由于大多数系统都具有GPU,因此对硬件的依赖关系不是一个大问题,但是如果GPU或CPU架构不断发展,通过仿真来保存webgl内容可能会面临挑战。在旧的(虚拟)计算机上运行它是有问题的。

但是“ Canvas vs WebGL”不一定是二进制选择。实际上,我更喜欢使用webgl进行效果处理,但其余工作都在画布上完成。当我在VM中运行它时,它仍然可以很好且快速地运行,而没有任何影响。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.