Skip to content

前期调研报告

Author:朱雨田

在大作业调研阶段的前期,我主要在我自己擅长的领域(计算机图形)范围内做了一些可以与操作系统方向结合的调研。

1. bevy

Bevy (https://bevy.rust-lang.net.cn/) 是一款使用 Rust 语言构建的开源游戏引擎,旨在提供简洁且数据驱动的开发体验。它支持 2D 和 3D 游戏开发,采用实体组件系统(ECS)架构,强调模块化设计。

我本人在课外的研究方向主要是计算机图形学。游戏引擎与该方向强相关,且游戏引擎对“计算资源”与“创作资产”等资源的管理思维与操作系统非常相似,具有分层抽象、data-oriented、模块化等来自现代操作系统抽象的设计。我自己也相当希望参与游戏引擎相关的工作,因此在最开始我优先在自己擅长范围内调研了该项目。

官网对它的优点介绍(Bevy 0.1 简介 - Bevy 游戏引擎)如下:

它拥有以下设计目标:

  • 功能强大:提供完整的 2D 和 3D 功能集
  • 简单:初学者易于上手,但对高级用户来说具有无限的灵活性
  • 数据为中心:使用实体组件系统范式的数据导向架构
  • 模块化:只使用你需要的部分。替换你不喜欢的部分
  • 快速:应用程序逻辑应该快速运行,并在可能的情况下并行运行
  • 高效:更改应该快速编译...等待不好玩

Bevy 有许多我认为让它区别于其他引擎的功能

  • Bevy ECS:一个自定义的实体组件系统,具有无与伦比的可用性和极快的性能
  • 渲染图:使用渲染图节点轻松构建自己的多线程渲染管道
  • Bevy UI:一个专门为 Bevy 构建的自定义 ECS 驱动的 UI 框架
  • 高效编译时间:使用 "快速编译" 配置,预计更改会在约 0.8-3.0 秒内编译完成

它还拥有大多数人对现代通用引擎的期望功能(略)。

目前 bevy 还处于测试阶段,尚有大量特性待开源社区实现。我预计进一步调研 bevy 中我们可以贡献的内容,但我们较早地放弃了以 bevy 相关开发作为选题。理由有:

  1. 其本质上还是游戏引擎,尽管许多设计理念与操作系统相通,它毕竟不是操作系统。这和这门课的主题可能相关性略低。
  2. 我们中有人的设备(AMD 核显)无法正常跑通 bevy 的示例项目。这会导致合作开发不便。
  3. 许多队友对游戏引擎几乎少有了解,学习成本较高。
  4. 现有的工业级实现(UE5)在各方面优化都几乎极佳,难以在“操作系统”相近的部分通过以更好的思维重写以实现 30% 的优化。

2. wgpu

wgpu gfx-rs/wgpu: A cross-platform, safe, pure-Rust graphics API. 是一个基于 WebGPU API 规范的跨平台、安全且纯粹的 Rust 图形 API。它旨在为开发者提供高效处理 GPU 上通用图形和计算任务的能力,填补淘汰旧有图形标准(如 OpenGL 和 WebGL)后的空白。作为 Firefox、Servo 和 Deno 中 WebGPU 集成的核心,wgpu 不仅可在 Web 环境运行,还支持在 macOS、iOS、Android、Windows 和 Linux 等系统上原生运行。

熊桐睿组长在群中向我们介绍了一个项目 wasm-gpu LucentFlux/wasm-gpu: Runs WASM on the GPU,主要是实现了一个 transpiler,让 WebAssembly 可以翻译为 wgpu 支持的 GPU 语言 wgsl,从而类似 cuda 地编写网页 gpu 程序。我在调研过程中对其基于的 wgpu 产生了兴趣,于是做了进一步调研。

用 wgpu 图形 API 编写 Rust 程序可以翻译为为各个设备、图形 API 上运行的程序,从而也起到了一个平台层的作用。bevy 的跨平台特性也依赖于 wgpu 的优雅。wgpu 程序的编写流程与常被称为“繁琐”的 Vulkan 图形 API 相似,但在我上手做出一些 demo 项目时,我发现,通过借用 Rust 的各种语言特性,wgpu 上编写程序可以做到相当的优雅、安全。我相当喜欢这个项目,即使它不会作为大作业的选题,今后我也会尝试围绕着它做一些别的开发。

与传统的图形 API 相比,wgpu 引入了现代化的图形开发方法,既适用于本地应用程序,也适用于基于 Web 的项目。它利用 Rust 语言的高性能和内存安全特性,确保了代码的健壮性。此外,wgpu 还引入了资源生命周期管理、命令缓冲区等概念,简化了复杂的图形渲染流程。

wgpu 的主要优点包括:

  • 跨平台支持:wgpu 可在多种平台上原生运行,包括 macOS、iOS、Android、Windows 和 Linux 等,方便开发者构建跨平台应用。
  • 安全性:作为纯 Rust 实现的图形 API,wgpu 利用 Rust 的内存安全特性,减少了内存泄漏和安全漏洞的风险。
  • 现代化设计:wgpu 借鉴了 Vulkan 等现代图形 API 的设计理念,提供简洁易用的高级 API,使开发者能够高效地进行图形编程。
  • 浏览器集成:wgpu 是 Firefox、Servo 和 Deno 等项目中 WebGPU 集成的核心,支持在 Web 环境中运行,拓展了应用场景。

我简要调研了我们可以尝试作为选题的 contribution:

  • 扩展功能支持:随着 WebGPU 规范的不断演进,wgpu 需要及时跟进并实现新特性。例如,Chrome 126 中引入了对 Vulkan 后端的缓冲区上传优化和着色器编译时间改进等功能,这些都需要在 wgpu 中进行相应的支持。
  • 提高跨平台兼容性:尽管 wgpu 已支持多种平台,但在某些平台上的性能优化和兼容性仍需改进。开发者可以针对特定平台进行优化,确保 wgpu 在各个平台上都能稳定、高效地运行。
  • 开发调试和性能分析工具:目前,与 cuda、opengl 常用的 NSight、RenderDoc 相比,针对 wgpu 的专用调试工具和性能分析工具相对较少。我们可以尝试借助操作系统中进程、内存、调试相关的知识编写此类程序。

但鉴于学习成本(类 Vulkan 的图形 API 本来就需要相当的图形知识才能理解其全部流程)、与操作系统的相关性(这仍然不太算是“操作系统”的相关内容),我们也没有对该选题做进一步探讨。

3. nova

Nova trynova/nova: JS engine lolz 是一个采用数据导向设计(Data-Oriented Design)并使用 Rust 编写的实验性 JavaScript(ECMAScript)和 WebAssembly 引擎。该项目目前处于早期开发阶段,主要作为探索和学习的平台,旨在验证此类引擎设计的可行性,未来可能发展为更成熟的项目。

这一部分的调研主要由组长进行,在第 2 周得到老师认可后,我们的调研方向就集中在了该项目上。

我个人对 Javascript 的了解仅限于基本语法,对 JS 引擎的许多具体功能并不了解。因此在前两个选题几乎被否决后,我在跟进阅读 Javascript 引擎相关的文档、阅读 nova 项目的源代码,以跟进组长的进度。