Skip to content

2026 年 Web 游戏技术栈

Web 游戏由三项技术驱动:WebGL、WebGPU 和 WebAssembly。2026 年,高性能浏览器游戏的最佳现代技术栈是:同时支持 WebGL2 和 WebGPU 的渲染器(Three.js 或 Babylon.js)、用于物理运算的 Wasm(Rapier),以及静态托管。对于约 87% 支持 WebGPU 的浏览器启用 WebGPU,其余浏览器则使用 WebGL2。每项技术解决的问题不同,也各有取舍。本指南将帮助你根据实际开发的内容做出选择,而不是追逐热度;其中的浏览器支持情况已核实至 2026 年 9 月。

简要结论

WebGL 2.0 到处都能运行,应付大多数游戏绰绰有余。需要广泛兼容性时,尤其是面向移动端时,就使用它。WebGPU 提供计算着色器和更好的性能,但会失去使用旧版浏览器和旧设备的玩家。WebAssembly 可以加快 CPU 代码,因此适合物理运算和寻路;但如果瓶颈在 GPU,它就帮不上忙。

2026 年,大多数游戏都会发布 WebGL 版本,并为兼容的浏览器选择性启用 WebGPU。Wasm 通常只会用于性能关键的代码路径,而不是整个游戏。

WebGL 2.0:稳妥而实用的选择

WebGL 2.0 自 2017 年起便已趋于稳定。所有现代浏览器都支持它。你的游戏可以在 Chrome、Firefox、Safari 和 Edge 上运行,甚至兼容 5 年以上的旧版本。它支持 iOS Safari 15+、Android 版 Chrome 和 Samsung Internet,甚至还能在 Xbox Edge 和 PlayStation 浏览器等主机浏览器中运行。

下面是一个基础的 WebGL 2 初始化示例:

javascript
const canvas = document.getElementById('game');
const gl = canvas.getContext('webgl2');

if (!gl) {
  // 回退到 WebGL 1 或显示错误
  const gl1 = canvas.getContext('webgl');
  if (!gl1) {
    showError('你的浏览器不支持 WebGL。');
    return;
  }
}

// 现在你已经获得了 GL 上下文
gl.clearColor(0.1, 0.1, 0.1, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);

你能获得什么

WebGL 2 提供实例化渲染,因此一次绘制调用就能绘制数千个对象。它支持变换反馈,可用于在 GPU 端运行粒子系统和模拟。你还可以使用多个渲染目标实现延迟渲染和 G-buffer,使用 3D 纹理实现体积效果,并使用整数纹理精确存储数据。

javascript
gl.drawArraysInstanced(gl.TRIANGLES, 0, vertexCount, instanceCount);

你无法获得什么

你无法运行用于通用 GPU 计算的计算着色器。它不支持无绑定纹理,因此会受到纹理单元数量的限制。它也不支持持久映射或显式内存控制,没有网格着色器或现代几何管线。

对于大多数 2D 游戏和许多 3D 游戏而言,这些限制并不重要。一些史上最成功的 Web 游戏正是使用 WebGL 2 发布的。

WebGPU:需要更强能力时的选择

WebGPU 是围绕现代 GPU 的实际工作方式设计的。Chrome 于 2023 年 5 月正式推出支持,到 2025 年末,所有主流浏览器都已支持。Chrome 113+、Safari 26+ 和 Edge 113+ 均可使用;Firefox 从 2025 年 7 月起在 Windows 版 141+ 中启用,并在 Apple Silicon macOS 版 145 中启用,而 Linux 和 Android 支持仍在逐步推出。Android 版 Chrome 在较新的设备上支持 WebGPU,iOS Safari 26+ 也同样支持。

以下是截至 2026 年 9 月的支持矩阵,数据来自 gpuweb 实现状态页面和各浏览器的发行说明。

浏览器已默认启用尚未支持
Chrome / EdgeWindows、macOS 和 ChromeOS 上的 113+。Linux 从 144 起支持 Intel Gen12+,从 147 起支持 Wayland 上的 NVIDIA。Android 12+ 上的 Android 版 Chrome 121+Windows on ARM(需通过标志启用)
SafarimacOS Tahoe、iOS、iPadOS 和 visionOS 上的 26(2025 年 9 月,依据 WebKit较旧的 macOS 版本
FirefoxWindows 上的 141(2025 年 7 月)、运行 macOS 26 的 Apple Silicon Mac 上的 145,以及所有 Apple Silicon macOS 版本上的 147(2026 年 1 月)Linux 和 Android(仅 Nightly;Linux 计划于 2026 年支持)
Samsung Internet24+

按照 caniuse 的统计,这约占全球页面浏览量的 87%,也正因如此,各大引擎都已开始跟进。Unity 6.6(2026 年 8 月)将 WebGPU 升级为完全支持的 Web 图形 API,并提供自动 WebGL2 回退;Three.js r185 和 Babylon.js 9.25 都能运行 WebGPU 渲染器,并自行回退;PlayCanvas 2.22 已有成熟的 WebGPU 路径;而 Godot 4.7 和 Phaser 4 在浏览器中仍仅支持 WebGL2。有关渲染方面的取舍,请参阅我们的游戏中的 WebGPU 与 WebGL 对比指南;你也可以运行 WebGL 和 WebGPU 检测工具,查看特定设备报告的支持情况。

问题在于,其余设备和浏览器仍不支持 WebGPU,因此你需要制定回退策略。

你能获得什么

计算着色器让你能够运行通用 GPU 计算,用于物理、粒子、AI 和图像处理。

javascript
// 一个并行处理数据的计算着色器
const computeShaderCode = `
@group(0) @binding(0) var<storage, read_write> data: array<f32>;

@compute @workgroup_size(64)
fn main(@builtin(global_invocation_id) id: vec3<u32>) {
  data[id.x] = data[id.x] * 2.0;
}
`;

你还能获得显式资源管理,从而减少意外的性能问题;使用渲染包预先录制绘制调用,以便重复使用;以及使用 WGSL——一种专为 GPU 设计的现代着色器语言,而不是类似 C 语言的权宜方案。

实用的 WebGPU 初始化方案

下面展示了如何初始化 WebGPU,并提供 WebGL 回退:

javascript
async function initGraphics(canvas) {
  // 首先尝试 WebGPU
  if (navigator.gpu) {
    const adapter = await navigator.gpu.requestAdapter();
    if (adapter) {
      const device = await adapter.requestDevice();
      const context = canvas.getContext('webgpu');
      
      context.configure({
        device,
        format: navigator.gpu.getPreferredCanvasFormat(),
      });
      
      return { type: 'webgpu', device, context };
    }
  }
  
  // 回退到 WebGL 2
  const gl = canvas.getContext('webgl2');
  if (gl) {
    return { type: 'webgl2', gl };
  }
  
  // 最后的选择:WebGL 1
  const gl1 = canvas.getContext('webgl');
  if (gl1) {
    return { type: 'webgl', gl: gl1 };
  }
  
  throw new Error('没有可用的图形 API');
}

它何时真正有用

在以下场景中,WebGPU 的优势尤为明显:使用计算着色器更新数百万个粒子,而无需在 CPU 和 GPU 之间往返传输数据;利用 GPU 加速碰撞检测和布料模拟;程序化生成地形、纹理或网格;实现 SSAO、泛光和景深等复杂后处理效果;或运行训练好的模型来控制 NPC 行为或生成图像效果。

如果你制作的是益智游戏或视觉小说,WebGPU 不会带来什么帮助。如果你制作的是大量使用粒子的动作游戏或复杂的 3D 世界,那么牺牲一部分兼容性或许是值得的。

WebAssembly:高速 CPU 代码

WebAssembly 能以接近原生代码的速度运行编译后的代码。它的重点不在图形,而在于加快 CPU 代码。

它何时有用

Wasm 非常适合物理引擎(Box2D、Bullet 和 Rapier 都提供 Wasm 构建)、大型网格寻路、资源解压缩、模拟旧游戏主机,以及将现有 C++ 或 Rust 代码库移植到 Web。

它何时没有帮助

GPU 并不关心绘制调用来自 JavaScript 还是 Wasm,因此渲染不会变得更快。获取资源或发送网络请求等受 I/O 限制的代码也不会受益。如果你的 JavaScript 本来就能在一毫秒内运行完毕,Wasm 也帮你节省不了多少时间。

实用的 Wasm 示例

下面是一个用于物理运算、编译为 Wasm 的最小 Rust 函数:

rust
// src/lib.rs
#[no_mangle]
pub extern "C" fn step_physics(dt: f32) {
    // 在这里编写你的物理代码
}

使用以下命令编译:

bash
wasm-pack build --target web

在 JavaScript 中使用:

javascript
import init, { step_physics } from './physics_bg.wasm';

await init();

function gameLoop(dt) {
  step_physics(dt); // 以接近原生代码的速度运行
  render();
  requestAnimationFrame(gameLoop);
}

多线程会让事情变复杂

Wasm 可以使用线程进行并行处理,但这需要 SharedArrayBuffer,也就意味着你必须在服务器上设置跨源隔离响应头:

Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp

这些响应头可能会导致现有功能失效。没有 CORP 响应头的第三方 iframe 将停止工作,一些分析脚本会失效,OAuth 弹窗也可能失败。你可以使用 credentialless 代替 require-corp 来减轻影响,但整个配置过程依然很麻烦。

如果你因为使用共享主机或 itch.io 而无法设置这些响应头,就不能使用 Wasm 多线程。不过,单线程 Wasm 依然可以正常工作。

面向真实游戏的实际决策

如果你制作的是 2D 平台游戏,请通过 Phaser 或 PixiJS 等工具使用 WebGL 2。WebGPU 没有必要,而 Wasm 也可以跳过,因为 JavaScript 对 2D 物理来说已经足够快。广泛兼容性比最新功能更重要,而且你的瓶颈在内容,而不是技术。

如果你制作的是 3D 开放世界游戏,可以从 WebGL 2 起步,但应为升级到 WebGPU 预留路径。考虑使用 Rapier 或 Bullet,通过 Wasm 执行物理运算。你现在需要尽可能广泛地覆盖设备,而之后计算着色器可用于改善植被、粒子和 LOD。使用 Wasm 运行物理运算则能降低 CPU 开销。

如果你正在移植 C++ 引擎,请通过 Emscripten 使用 Wasm。图形默认使用 WebGL 2;如果引擎支持,也可以使用 WebGPU。你已经拥有代码,而 Emscripten 会负责转换。

如果你制作的是益智游戏,请使用 Canvas 2D,或通过 Phaser 使用 WebGL 2。其他技术都可以跳过。简单的游戏就应该保持简单。

如果你确实需要极致性能,并愿意放弃一部分使用旧版浏览器的玩家,可以选择 WebGPU 加 Wasm。但在投入之前,务必先衡量它对你的实际受众有多大影响。

真正让游戏变快的因素

以下是决定 Web 游戏能否流畅运行的因素,按重要性排序。

资源大小约占感知性能的一半。一个 2MB、1 秒内完成加载的游戏,会比一个帧率更高但大小为 50MB 的游戏感觉更快。压缩所有内容;对于 3D 模型,glTF 优化器可以一次完成 Meshopt 处理和纹理尺寸调整。尽可能延迟加载。

绘制调用对 3D 游戏影响很大,可能占到性能预算的 30%。批处理几何体、使用纹理图集,并对重复对象采用实例化。这比选择 WebGL 还是 WebGPU 重要得多。

JavaScript 性能可能占 15%。避免在热点循环中分配内存,使用类型化数组,并在优化前先进行性能分析。

图形 API 的选择呢?坦白说,可能只占 5%。对大多数游戏来说,如何使用 API 比选择哪个 API 更重要。

如果游戏运行缓慢,先检查是否在启动时加载了过多内容。然后检查是否发出了太多绘制调用。接着检查 JavaScript 是否在游戏循环中做了低效的事情。只有完成这些检查之后,你才应该考虑更换图形 API 是否会有帮助。

我实际会使用的方案

如果今天开始开发一款新的 Web 游戏,我会使用 Three.js(r185,2026 年 7 月)或 Babylon.js(9.x)进行渲染,因为它们抽象了 WebGL 和 WebGPU 之间的差异。在物理方面,如果需要 3D 物理,我会使用 Rapier(由 Rust 编译为 Wasm);对于更简单的游戏,则直接使用引擎内置的 2D 物理系统。音频使用 Howler.js 或直接使用 Web Audio API。构建工具选择 Vite,因为它在开发环境中速度很快,也能生成优秀的生产构建。托管则使用 Netlify、Vercel、GitHub Pages 或 itch.io 等静态托管服务。

这套技术栈能够发布可在 98% 以上设备上运行的游戏,同时也为 WebGPU 成为默认选项做好准备。

决定之前先测试

在最终确定技术栈之前,先制作一个小型原型并进行实际测试。使用 Chrome DevTools 的限速功能测试 3G 网络下的加载时间。在慢速网络下,你的游戏应该能在 5 秒内进入可玩状态。在低端 Android 手机上测试性能,可以借一部设备,也可以使用 BrowserStack。如果游戏能在那里运行,就几乎能在任何地方运行。请专门在 Safari 上进行测试,因为它的差异足以带来意外问题。如果你的游戏将发布到 Newgrounds 或 Kongregate,还要在 iframe 中进行测试。

与争论 WebGL 和 WebGPU 谁更好相比,这些测试更能发现真正的问题。

常见问题

高性能浏览器游戏的最佳现代技术栈是什么?

使用同时支持两种 API 的渲染器,在 CPU 成为瓶颈的地方使用 Wasm,并保持较小的构建体积。具体来说:Three.js 或 Babylon.js(WebGPU,并自动回退到 WebGL2)、编译为 Wasm 的 Rapier 用于 3D 物理、Howler.js 或原生 Web Audio 用于声音、Vite 用于构建、KTX2 纹理和经 Meshopt 压缩的 glTF 用于资源,并通过 CDN 进行静态托管。如果你更愿意从完整引擎起步,PlayCanvas 和 Unity 6.6 都提供带回退机制的 WebGPU,而 Godot 则提供体积较小的 WebGL2 构建。Web 游戏引擎对比按构建体积和加载时间对这些引擎进行了排名。

2026 年 WebGL 还值得使用吗?

值得,而且它仍然是基准方案。WebGL 2.0 可以在玩家拥有的所有浏览器和设备上运行,包括 Linux 和 Android 上的 Firefox 版本,以及仍不支持 WebGPU 的旧手机。WebGPU 的推出不会让 WebGL 构建停止工作;对于 2D 游戏和大多数 3D 游戏而言,WebGL2 原本就不是瓶颈。发布 WebGL2 版本;如果渲染器免费提供 WebGPU 支持,就将它作为升级选项;并把精力放在资源大小和绘制调用上。

我可以使用 WebGPU 制作简单游戏吗?

可以,但通常没必要。益智游戏、平台游戏或卡牌游戏在 WebGPU 上的运行效果并不会比 WebGL2 更好,反而会失去浏览器尚不支持 WebGPU 的玩家。对简单游戏来说,只有当某种效果需要计算着色器时,WebGPU 才真正有用,例如数千个粒子、流体或布料模拟,以及由 GPU 驱动的人群。遇到这种情况,应使用能够自动回退的库(如 Three.js 或 Babylon.js),而不是直接编写原生 WebGPU;你也可以描述游戏,让 Cinevva 为你使用 WebGPU 构建。如果你想使用原生 API,请参阅我们的 WebGPU 入门教程

延伸阅读

如果你不想从零开始构建,Web 游戏引擎对比介绍了各种完整引擎。在浏览器中使用 Three.js + USDC展示了如何在 Three.js 中加载 USD 资源。如何在 itch.io 上发布游戏则介绍了游戏完成后的发布流程。

以下实操教程将深入讲解各项 API:

合适的技术栈,就是能让你的游戏顺利发布的技术栈。选择你熟悉的工具,尽早测试,稍后再优化。

现在就试试跳过技术栈选型,直接获得成果

WebGL、物理系统和资源管线都交给我们。你只需描述游戏。

免费生成 →免费,直接在浏览器里运行,无需安装。