探索WebGPU:跨平台Web图形和计算的新机遇

2,653 阅读4分钟

引文

随着 Web 应用的不断发展和复杂度的提升,我们需要更强大的工具来 满足各种复杂的图形和计算需求。

在这个背景下,WebGPU 已然崛起,作为一个全新的 Web 标准,它提供了一个跨平台的接口,用于渲染和计算任务。

本篇参考 Chrome 团队在开发者博客的文章 WebGPU: A New Way to Perform Graphics and Computation on the Web,详细分析WebGPU 特性以及它是如何推动 Web 图形和计算发展的。

支持

首先,WebGPU 标准的开发是由 W3C 的 GPU for the Web 工作组负责的,这个工作组旨在创建一个更现代化、安全、效率更高的 Web图形接口。

它利用了现代硬件的全部能力,不仅提供了对最新图形和计算功能的支持,还在内存管理、错误处理和调试等方面提供了丰富功能。

image.png

跨平台

WebGPU 的最大优势之一是:跨平台性。

无论使用的是Windows、macOS、Linux,还是Android,WebGPU都可在设备上运行。它还支持 Vulkan、Metal 或 Direct3D 12 的移动设备上运行,这些涵盖了大多数现代智能手机和平板电脑设备。

开发者可以构建一次应用,然后在任何设备上运行,无需担心硬件兼容性问题。

JS 调用代码:

// 初始化WebGPU上下文
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

// 创建WebGPU渲染管线
const pipeline = device.createRenderPipeline({
  // 管线配置信息
  // ...
});

性能

WebGPU 的性能优势也是其魅力所在。

由于其底层特性,允许开发者直接操作GPU,从而实现更高效的渲染和计算,这意味着 Web 应用可以以更高的帧率运行,同时也可以处理更复杂的图形和计算任务。

代码示例:

// 在WebGPU中进行GPU计算
[[block]] struct Uniforms {
  // Uniform数据
  // ...
};

[[group(0), binding(0)]] var<storage, read> uniforms: Uniforms;

[[group(0), binding(1)]] var<storage, read_write> buffer: [[access(read)]] array<float, 2>;

[[stage(compute), workgroup_size(1)]] fn computeMain([[builtin(global_invocation_id)]] GlobalID: vec3<u32>) {
  // 计算逻辑
  // ...
}

image.png

WebGPU 相对于 WebGL 有更好的性能,原因是:

  • WebGL 使用JavaScript和着色器语言(通常是GLSL)编写;

  • WebGPU 虽然也使用JavaScript,但其着色器语言(WGSL)更加现代化和简化,通过提供更多的底层控制,优化性能;

健壮性

除此之外,为了强调安全性和健壮性,WebGPU 设计了一套全新的API,使得在不牺牲性能的前提下,编写更安全和健壮的代码。包括:

1、类型安全: WebGPU引入了类型安全的编程模型,通过强类型来减少编程错误。编译器会在编译阶段检查类型错误,避免了一些在运行时才能发现的问题。

2、内存管理:WebGPU提供了对内存的更细粒度控制,通过资源对象和视图对象的引用计数来自动管理内存,减少内存泄漏和悬挂指针等问题出现。

3、错误处理:WebGPU设计了详细的错误处理机制,当出现错误时,API会返回相关的错误码和消息,以便更轻松 debugger。

代码示例:

// 使用WebGPU资源时进行错误处理
const texture = device.createTexture({
  // 纹理配置
  // ...
});

if (!texture) {
  console.error("创建纹理失败!");
  return;
}

4、逐步实现: WebGPU 的实现在标准化过程中是逐步的,不稳定的特性会被标记,并在后续迭代,有助于防止未经充分测试的功能被错误使用。

5、跨平台测试:WebGPU 在不同平台中进行测试,确保它在各种环境下的稳定性和兼容性。

6、安全性:WebGPU 采用了严格的安全模型,避免了对设备的过度访问和滥用。它对 GPU 访问权限进行了限制,以保护用户的隐私和系统安全。

小结

目前,WebGPU 的浏览器支持如下:

image.png

目前处于标准制定和实施的阶段,完整的跨浏览器支持仍在发展中。web + 3D 这是非常值得探索的,并且在未来只会变得更加强大。

image.png

本文最后,推荐适合 WebGPU 初学者和进阶者的传送门:

1、官方规范:WebGPU Specification

2、示例代码:WebGPU Samples on MDN

3、演示和实验:Chrome Developers Blog - WebGPU

4、快速入门指南:WebGPU Quick Start Guide

5、在GitHub上的资源:GitHub - WebGPU

OK,以上便是本次分享,希望各位喜欢~ 欢迎点赞、收藏、评论 🤟 我是安东尼 🤠 人气技术博主 💥 坚持千日更文 ✍ 关注我,安东尼陪你一起度过漫长编程岁月 🌏 微信 ATAR53,拉你入群,不定期抽奖、只学习交友、不推文卖课~