除了性能外,使用WebGL而不是2D-Canvas进行2D游戏/应用程序开发的理由是什么?
换句话说,WebGL提供了哪些2D功能,这些功能不容易通过2D-Canvas实现?
除了性能外,使用WebGL而不是2D-Canvas进行2D游戏/应用程序开发的理由是什么?
换句话说,WebGL提供了哪些2D功能,这些功能不容易通过2D-Canvas实现?
因此,我将讨论canvas和webGL API在这些方面的差异。
Canvas和WebGL都是JavaScript API。它们在集成(绑定)方面基本相同。它们都被一些库支持,可以加速您的编码。不同的库可以给您不同的组织代码的方式,因此库的选择决定了您的绘图API的结构,但它仍然基本相同(其余的代码如何与其绑定在一起)。如果您使用库,则编写代码的易用性取决于库本身。
如果您从零开始编写代码,则Canvas API要容易学习和理解得多。它只需要最少的数学知识,开发快速简单。
使用WebGL API需要强大的数学技能和对渲染流水线的充分理解。具备这些技能的人比较难找到,生产速度较慢(由于这种代码库的大小和复杂性),因此成本更高。
WebGL更快,并且具有更多功能。毫无疑问,它是一种本地的3D API,可以完全访问渲染流水线,代码和效果执行速度更快,可调整的内容更多。使用WebGL真的没有限制。
Canvas和WebGL都是HTML5的好东西。通常支持其中一个设备也会支持另一个设备。
总之:
附言:欢迎讨论。
Canvas API | WebGL Equivalent | Three.js Framework Equivalent |
---|---|---|
缩放 | texImage2D + 修改顶点 | 摄像机 |
旋转 | texImage2D + 修改顶点 | 摄像机 |
平移 | texImage2D + 修改顶点 | 摄像机 |
变换 | texImage2D + 修改顶点 | 摄像机 |
清除矩形 | 清除+视口,或texImage2d | 纹理 |
填充矩形 | 清除+视口,或texImage2d | 纹理 |
描边矩形 | texImage2d | 纹理 |
路径 | texImage2d + 模板+ 顶点路径 | 摄像机+对象 |
填充文本 | texImage2d + 模板+ 顶点路径 | 摄像机+对象+纹理 |
描边文本 | texImage2d + 模板+ 顶点路径 | 摄像机+对象+纹理 |
绘制图像 | texImage2d | 纹理 |
创建图像数据 | 在CPU应用中填充texImage2d的缓冲区 | CPU应用程序代码 |
获取图像数据 | readpixels | readpixels |
设置图像数据 | 在CPU应用中填充texImage2d的缓冲区 | 在CPU应用中填充texImage2d的缓冲区 |
+可编程着色器(顶点,片段) | ||
+离屏缓冲区 | ||
+高效的深度三维表示 | ||
+高效的点(和其他基元)渲染 | ||
+便利方法-材质(精灵...) | ||
+便利方法-灯光 | ||
+便利方法-场景 |
根据我在自己的应用上的经验,图形着色器一直是我需要WebGL支持的唯一原因。对于我来说,易用性并不重要,因为这两个框架都可以通过three.js进行抽象。假设我不需要着色器,我允许使用任何一个框架以最大化浏览器/计算机的支持。
好的,性能将是选择WebGL而不是canvas的最大原因之一,因为当您编写游戏时,它必须快速。但是,选择WebGL而不是canvas还有其他几个原因。如果您正在开发商业游戏应用程序,则可以使用它来编写着色器、灯光和缩放等功能。此外,当显示超过50个精灵时,canvas会变得卡顿。
在Canvas上你能做的所有事情,在WebGL上也都能做到:Canvas让你可以使用get/putImageData来压缩字节,同时你也可以使用WebGL以编程方式画线条、圆形等。
如果你想进行密集绘图,例如每秒60帧的复杂效果,那么性能差距就很大了。在2D Canvas中很慢的事情在WebGL中可以运行良好。性能是WebGL的基本特点。
但是,WebGL编程非常复杂。看看Canvas是否足够好,或者寻找一个可以减轻痛苦的库。
WebGL的另一个缺点是它不适用于IE(但什么适用呢?)和某些移动平台。请参阅此处以获取兼容性信息:https://caniuse.com/webgl
由于您特别需要一些经典的2D效果,这些效果在canvas中表现不佳:
...但是当然您可以手动完成所有操作,包括上述操作,因为您有像素访问权限。但这可能会变得非常慢。理论上,您可以使用emscripten Mesa openGl渲染到canvas。
使用webGL的另一个重要原因是其结果非常易于移植到任何其他地方。这也使得该技能更具价值。
使用canvas的原因是它仍然得到更好的支持,并且如果您学会逐像素进行操作,那么这也是非常有价值的课程。
没有GPU,WebGL无法使用。
这种硬件依赖并不是一个大问题,因为大多数系统都有GPU,但如果GPU或CPU架构发生变化,通过仿真来保留webgl内容可能会很具有挑战性。在旧的(虚拟化的)计算机上运行它是有问题的。
但“Canvas vs WebGL”不必是二元选择。 我实际上更喜欢使用webgl进行效果处理,但其他部分则使用canvas。 当我在虚拟机中运行它时,它仍然可以快速地工作得很好,只是没有效果。
更新:不幸的是,一些浏览器(Windows上的Chrome,Linux上的所有应用,其他?)实现了良好的仿真层使检测贫乏/无GPU变得困难。在这些情况下,游戏或用户必须手动禁用WebGL才能获得实际的性能优势......或者在2D实现不良的情况下降级。据说这也可能发生。[感谢gman]
if (window.WebGLRenderingContext) {
webGLcanvasApp()
} else if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {
html5CanvasAppFMobile()
} else {
html5CanvasApp()
}