28 个版本
新 0.9.7 | 2024 年 8 月 19 日 |
---|---|
0.9.4 | 2024 年 6 月 11 日 |
0.9.2 | 2024 年 3 月 20 日 |
0.8.1 | 2023 年 10 月 31 日 |
0.1.2 | 2019 年 11 月 19 日 |
65 在 图形 API 中
10,051 每月下载量
用于 9 个 crate(2 个直接使用)
610KB
12K SLoC
包含(JAR 文件,55KB) gradle-wrapper.jar
surfman 
surfman
是一个低级、跨平台的 Rust 库,用于管理 表面,即 GPU 内存中的图像数据块。使用此库,您可以
-
在 CPU 上的窗口(可能是使用
winit
创建的)中绘制。 -
使用 OpenGL 在窗口(通过
winit
或其他方式创建)中渲染。 -
使用 OpenGL 在离屏表面中渲染。
-
使用在另一个线程上创建的表面作为另一个线程上的 OpenGL 纹理。
-
使用特定平台的 GPU API(如 Metal)在表面上绘制。
surfman
构成了 Servo 项目的低级图形基础设施,其中它允许轻松地将浏览器的 WebGL 和 WebXR 代码移植到各种平台。
surfman
不是什么
surfman
不是一个功能齐全的 GPU 渲染 API。它不尝试抽象 OpenGL、Metal 和 Direct3D 等渲染库。为此,请尝试 gfx-rs。
surfman
也不是一个窗口解决方案。它只能渲染到已打开的窗口,并且需要与 winit 等crate配合使用才能实际打开窗口。
同样,surfman
不是一个 UI 工具包。对于这个,请参见 GTK+ 和许多其他库。但是,可以与任何这些 UI 工具包一起使用 surfman
,以有效地将 GPU 渲染集成到应用程序中。
为什么使用 surfman
?
大部分这些功能都可以使用其他库实现,例如 glutin
和 SDL。然而,对于一些用例,使用 surfman
可以实现更好的性能和/或正确性。例如
-
在多 GPU 系统上,游戏通常想要使用独立 GPU 而不是集成 GPU 以获得更好的性能,而 UI 应用程序则相反,为了更好的能耗。然而,大多数面向游戏的开源 OpenGL 窗口库最终在 Linux 和 macOS 上使用独立 GPU,在 Windows 上使用集成 GPU。在这样的系统上,
surfman
明确允许您选择想要渲染的 GPU。 -
OpenGL 的 共享上下文 或 共享列表 功能允许您在不同的上下文中共享纹理。然而,这通常会导致驱动程序错误,并且即使它工作,也会导致大多数操作需要互斥锁。有效的纹理共享需要使用平台特定的 API,而
surfman
抽象了这些 API。 -
Windows 上 OpenGL 的 ANGLE 实现通常不是线程安全的,因此尝试在后台线程上进行渲染通常会崩溃。
surfman
仔细地绕过所有安全问题,以确保库可以从任何线程安全使用。 -
一些像模拟器和视频播放器这样的应用程序,它们在 CPU 上绘制,想要尽可能避免复制像素。像
glTexImage2D
和XPutImage
这样的经典 API 会导致数据被复制多次。相比之下,surfman
允许您尽可能少地复制屏幕渲染——有时甚至为零,具体取决于平台。
平台支持
库支持以下平台
-
Windows,通过本机 WGL 框架使用 OpenGL。
-
Windows,通过 Google 的 ANGLE 库使用 OpenGL。
-
macOS,通过本机 CGL 框架使用 OpenGL。
-
macOS,使用 Metal。
-
Linux/其他 Unix,通过 Wayland 使用 OpenGL。
-
Linux/其他 Unix,通过 X11 的 GLX 使用 OpenGL。
-
Android P 及以上版本,使用 OpenGL。
-
通过 OSMesa 框架的 OpenGL 通用 CPU 渲染。
未来工作
以下功能可能稍后添加
-
支持 Android Marshmallow、Nougat 和 Oreo。
-
部分呈现,允许操作系统仅合成窗口已更改的区域。
-
在更多平台上支持 CPU 渲染。(目前,CPU 渲染功能仅在 macOS 上工作。)
-
支持 Vulkan。
-
Windows 上的 Direct3D 11 支持。
-
YUV 表面,用于软件视频编解码器。
-
支持使用 WebAssembly 在浏览器中运行。
许可证
surfman
的许可条款与 Rust 本身相同。
surfman
遵守 Rust 本身的相同行为准则。
依赖关系
~2–13MB
~166K SLoC