ChatGPT解决这个技术问题 Extra ChatGPT

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

除了性能之外,是否有任何理由将 WebGL 而不是 2D-Canvas 用于 2D 游戏/应用程序?

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

顺便说一句:虽然您不能在同一个画布上使用 2d 和 3d 上下文 API,但您仍然可以通过使用多个画布来组合它们。 WebGL 可以使用 2d 画布作为纹理,而 2d 画布可以使用 WebGL 画布作为 drawImage 的源。
有关@Philipp 评论的更多详细信息,请参阅this Q/A

T
Tanay

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

更好地集成到他们已经构建的系统中

更容易使用

是比较快的

有更多的能力或更适合他们的需求

成本

更独立于平台

因此,我将讨论 canvas 和 webGL API 在这些品质方面的区别。

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

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

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

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

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

所以,总结一下:

合并绘图API代码和其余部分(集成):类似

使用方便:

(带库)canvas = webGL

(从头开始)webGL << canvas

速度:webGL > 画布

能力:webGL > 画布

成本:webGL 要贵得多

平台:非常相似

希望这可以帮助。

PS 公开讨论。


@Abstract,Web GL 的好教程在哪里,需要多少小时?
@Pacerier 只是用谷歌搜索它,前几个点击可能就足够了。然而,通常需要数周和数月才能熟练掌握 webgl 和图形编程,而真正擅长则需要数年时间。您需要学习 API 的不仅仅是一些随机的“库”,仅此而已。
@AbstractAlgorithm,我的意思是,如果您是编程画布的大师,那么切换到 web GL 需要多少小时?
@Pacerier 取决于开发人员,正如 Abstract 已经说过所涉及的开发人员的数学技能。实在是无法量化。
@Crashalot 它保持得很好。 Canvas 仍然是一个更简单的 API,主要用于 CPU 绘图,而 webGL/webGPU 是一个完全公开的 GPU 绘图 API - 您可以对其进行更多控制并使其更快,但您可能会在开发时间和所需知识方面付出代价。
P
Prabindh

最大的优势是流水线的可编程性和性能。例如,假设您正在绘制 2 个盒子,一个在另一个上方,一个是隐藏的,一些 GL 实现可以丢弃隐藏的盒子。

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

https://i.stack.imgur.com/y0MQ2.png


重新“一些 GL 实现有丢弃隐藏框的范围”但是你不能检测到 JS 中被覆盖的部分,因此不重绘不需要的部分吗?
1
16807

根据我在 own applications 上的经验,图形着色器是我需要 WebGL 支持的唯一原因。易用性对我来说意义不大,因为这两个框架都可以用 three.js 抽象出来。假设我不需要着色器,我允许使用任一框架来最大化浏览器/机器支持。


e
emackey

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

http://glslsandbox.com/e#207.3

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


因此与画布相比,WebGL 或多或少地对操作系统征税?
我很好奇是否所有的画布最终都会做 webgl;如果它使用预编译的常见用例 webgl,这将比直接 webgl 更有效;或者除非您使用 webgl,否则它不会以任何方式与 opengl 交互。
@Dmitry 很好的问题,不同的浏览器可以自由地采取不同的方法来解决这个问题。但是,无论他们如何加速 Canvas 2D API,Canvas 2D API 本身都不提供可编程着色器或顶点数组缓冲区。这是一个“健谈”的 API(每个绘制的元素一个 JavaScript 到本机调用),而 WebGL 的 API 允许批量数据加载和基于 GPU 的自定义处理。
X
Xk0nSid

嗯,性能将是最大的原因之一,因为当你编写游戏时,它必须很快。但是还有其他几个原因,您可能希望选择 WebGL 而不是画布。它提供了对着色器、照明和缩放进行编码的可能性,如果您正在开发商业游戏应用程序,这很重要。在 50 个左右的精灵之后,画布也会变得迟钝。


尤其是在像安卓平板电脑这样的设备上,在 JavaScript 中 CPU 会快速过载,使用 WebGL 的主要原因是将渲染负载转移到 GPU 上。
@Xk0n,Re“提供了编码着色器、照明和缩放的可能性”,但是它不会变得依赖于 GPU 吗?
您仍然可以在 2D 画布上下文中使用 setTransform 进行缩放。然而,当从精灵表缩放时,我一直在 2D 画布中遇到纹理渗色问题,这就是我转向 WebGL 的原因。我看到了一个教程,可以阻止最近邻采样超出源矩形,这应该可以解决我的前沿问题。
50岁以后?哎呀,我正准备做几万块瓷砖......
@Xk0nSid 您能否扩展一下“画布在 50 个左右的精灵之后也会变得迟钝”。你有一个链接来备份这个吗?
G
GameAlchemist

Canvas 没有任何事情可以用 webGL 做:canvas 允许使用 get/putImageData 粉碎字节,并且您可以使用 webGL 以编程方式绘制线条、圆圈等。但是,如果您要绘制一些绘图,以及一些 60 fps 的效果,那么性能差距是如此之大,以至于使用 canvas 是不可能的,而当它在 webGL 中运行正常时。性能是一个根本特征。

然而,webGL 的编程相当复杂:看看 canvas 是否对您来说足够好,或者寻找一个可以减轻痛苦的库...
其他缺点:它在 IE 上不起作用(但是什么?),以及一些手机。
请参阅此处了解兼容性:http://caniuse.com/webgl


2021 年此意见的任何更新(除了现在对 webgl 的广泛兼容性)?感谢分享!
s
starmole

因为您特别想要一些不适用于画布的经典 2d 东西:

颜色变换(如闪烁精灵)

重复位图填充

在旋转下平铺地图(在画布下,一些实现会创建接缝)

深层(非常依赖于实现)

乘法或加法混合

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

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

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


顺便说一句,WebGL 是多线程的吗?你能有两个线程同时绘制屏幕的两个部分吗?
我认为答案是“是与否”,因为网络浏览器本质上是单线程的,因此将要渲染的数据复制到 GPU 并不是多线程的。但是,一旦着色器开始渲染,您将使用显卡的大规模并行化,这实际上是一次绘制到屏幕的多个部分。如果我错了,请纠正我,任何人。
感谢分享。您认为这种分析在 2021 年仍然成立吗?
u
user185953

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

但“Canvas vs WebGL”不一定是二元选择。我实际上更喜欢使用 webgl 来制作效果,而其余的则在画布中完成。当我在 VM 中运行它时,它仍然运行良好且快速,只是没有效果。

更新:不幸的是,一些浏览器(Chrome on WindowsEverything on Linux、其他?)实现了良好的模拟层 that make detection of poor/no GPUs hard。在这些情况下,游戏或用户必须手动禁用 WebGL 才能获得实际的性能优势... ...或降级,当 2D 实现不佳时。据称,这也可能发生。 [谢谢gman]


引用页面:“SwiftShader 的性能应该足以查看简单的 3D 内容”。 “工作”,但无法用于游戏。 @gman
正确,但是这个“没有 GPU 就无法使用 WebGL”是错误的。它可能很慢,但并非无法使用。如果它在没有 GPU 的情况下无法使用,那么 Chrome 中就没有理由在没有 GPU 的情况下使用它。
b
bren

由于 WebGL 是特别新的技术,而 HTML5 画布更加成熟,您想使用什么取决于您的用户。如果您认为您的用户将使用移动设备,那么我会建议使用 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()
    }

来源:
Proper way to detect WebGL support?
What is the best way to detect a mobile device in jQuery?