4个版本

0.1.3 2022年12月16日
0.1.2 2022年12月16日
0.1.1 2022年12月16日
0.1.0 2022年12月16日

75渲染 中排名

每月下载量 33

Apache-2.0

575KB
15K SLoC

forma logo

crates.io badge

一个(彻底)并行化的 实验性 Rust矢量图形渲染器,具有软件(CPU)和硬件(GPU)后端,以下目标按顺序排列:

  1. 可移植性;支持Fuchsia、Linux、macOS、Windows、Android和iOS。
  2. 性能;利用以计算为重点的流水线,该流水线在指令级别和线程级别都高度并行化。
  3. 简单性;实现易于理解的4级流水线。
  4. 大小;最小化依赖项数量,并专注于矢量图形。

它依赖于Rust的SIMD自动向量化/内建函数和Rayon,在CPU上实现良好的性能,同时使用WebGPU (wgpu) 来利用GPU。

入门

将以下内容添加到您的 Cargo.toml 依赖项中

forma = { version = "0.1.0", package = "forma-render" }

4级流水线

1. 曲线展平 2. 线段光栅化 3. 排序 4. 绘制
贝塞尔曲线 线段 像素段 排序后的像素段,旧瓦片
⬇️⬇️⬇️ ⬇️⬇️⬇️ ⬇️⬇️⬇️ ⬇️⬇️⬇️
线段 像素段 排序后的像素段 新鲜绘制的瓦片

实现亮点 ✨

以下是几个实现亮点,使forma不同于常用的矢量渲染器。

曲率感知展平

所有高阶三次贝塞尔曲线都通过二次曲线近似,然后根据其曲率并行展平为线段。这种技术是由Raph Levien开发的。

廉价的平移和旋转

平移和旋转可以在不重新展平曲线的情况下进行渲染,同时保持全部质量。

并行像素网格交点

线段通过与像素网格相交转换为像素段。我们开发了一种简单的方法,该方法的计算复杂度为O(1),并且是并行运行的。

高效的排序

我们将crumsort移植到Rust,并使用Rayon进行并行化,在64位随机数据上提供了比pdqsort实现更好的性能。使用排序散列像素段的想法是从Allan MacKinnon在Spinel上的工作获得的灵感。

仅更新更改的瓦片(目前仅限CPU)

我们实现了一个针对每个瓦片的快速失败优化器,该优化器试图完全跳过绘制步骤。类似的方案也可以在GPU上进行测试。

动画在屏幕上的显示效果 仅更新的瓦片
juice animation updated tiles

您可以使用以下命令运行上面的演示:

cargo run --release -p demo -- spaceship

类似的项目

forma受到了以下项目的深刻启发:

  • Spinel,后端使用Vulkan 1.2
  • vello,后端使用wgpu

示例

您可以使用包含的demo示例来渲染一些示例,其中之一是一个不合规且不完整的SVG渲染器

cargo run --release -p demo -- svg assets/svgs/paris-30k.svg

它以交互式的帧率渲染巨大的SVG文件,甚至在CPU上也能做到:(与您的网络浏览器比较)

window rendering map of Germany

(目前)缺失的部分 🧩

由于此项目仍在进行中,API中的损坏虽然不大,但预计会出现。GPU后端的表现也预计将有所提高,特别是在移动设备上,因为性能较差,目前建议使用CPU后端。

除此之外

  • 自动层排序
  • 笔触
  • 更多用于混合和渐变的颜色空间
  • 更快的GPU排序器
  • 使用f16以实现优秀的移动GPU性能

注意

这不是一个官方支持的Google产品。

依赖项

~2–15MB
~182K SLoC