#2d-graphics #2d-rendering #vulkan #skia #graphics #2d #ash

skulpin

该包通过结合Vulkan和Skia,提供了一个简单的方式来绘制硬件加速的2D图形。

36个版本

0.14.1 2021年10月31日
0.14.0 2021年5月27日
0.13.1 2021年4月3日
0.13.0 2021年3月14日
0.2.2 2019年11月24日

渲染 分类中排名 39

Download history 18/week @ 2024-03-11 20/week @ 2024-03-18 83/week @ 2024-04-01 14/week @ 2024-04-08 23/week @ 2024-04-15 65/week @ 2024-04-22 10/week @ 2024-04-29 12/week @ 2024-05-06 15/week @ 2024-05-13 15/week @ 2024-05-20 31/week @ 2024-05-27 15/week @ 2024-06-03 16/week @ 2024-06-10 13/week @ 2024-06-17 16/week @ 2024-06-24

每月下载 69
2 个包 中使用

MIT/Apache

87KB
1K SLoC

skulpin

Skia + Vulkan = Skulpin

该包通过结合vulkan和skia,提供了一个简单的方式来绘制硬件加速的2D图形。

Build Status Crates.io

Example Screenshot

该包主要依赖于

注意:有关如何获取skia二进制文件的更多信息,请参阅skia-bindings。在许多情况下,该包将下载由其项目的CI创建的二进制文件。

该包与raw-window-handle集成,这使得它可以与sdl2、winit以及任何支持raw-window-handle的其他窗口框架一起使用。

运行示例

首先,确保满足以下操作系统相关的需求。之后,可以正常运行示例。

可以查看交互式示例以获取键盘/鼠标输入的简单方法。

# winit 0.24
cargo run --example interactive_winit_app --features winit-app,winit-25

# sdl2
cargo run --example interactive_sdl2

物理演示也很有趣。物理

cargo run --example physics --features winit-app,winit-25

以下是物理和交互式示例的视频。

IMAGE ALT TEXT

状态

该包处于“维护”模式 - 我不会添加新功能或计划任何API重构,但我计划在必要时进行修复,以解决可能出现的问题,并保持与更广泛的Rust生态系统的兼容性。

最初这只是一个原型,但现在它被neovide使用。

Google的新UI框架Flutter使用Skia + Vulkan堆栈在移动设备上实现60+ FPS。由于Google对该堆栈的投资很深,我预计Skia将对这种类型的使用提供相对长期的支持。

使用方法

目前有三种方式可以使用该库与winit结合使用。

  • app - 实现AppHandler特质并启动应用程序。这很简单,但不够灵活。目前仅在winit中使用时支持。
  • 仅渲染器 - 您自行管理窗口和事件循环。然后添加渲染器来绘制。窗口应该被包装在 skulpin::Window 的实现中。已提供 sdl2winit 的实现。

如果您更喜欢 sdl2,则需要直接使用渲染器。请参阅 仅sdl2渲染器

别忘了安装适用于您平台的必备软件!(见“要求”)

特性标志

  • skia-complete - 包括以下所有Skia特性。** 默认启用 **
  • skia-shaper - 启用使用Harfbuzz和ICU进行文本形状
  • skia-svg - 此特性启用SVG渲染后端
  • skia-textlayout - 使Skia模块skparagraph可用,其中包含用于段落布局的类型
  • 有关这些标志的更多信息,请参阅 skia-safe 读取文件

skia-bindings 预构建二进制文件仅适用于某些特性的组合。截至撰写本文时,它适用于没有任何特性、每个特性单独或所有特性都启用的情况。需要 vulkan 特性,并且隐式使用,因此启用任何特性单独都将显著增加构建时间。建议使用所有特性(默认行为),或禁用所有特性。(使用 default-features = false

Skulpin特性

  • winit-app - 包含winit应用程序包装器。它不如直接使用渲染器灵活,但易于使用。

如果您使用winit-app,您必须指定winit版本特性标志(见下文)

Winit版本特性标志

  • winit-21
  • winit-22
  • winit-23
  • winit-24
  • winit-25
  • winit-latest

(这些特性名称与imgui-rs存储库匹配。)

特性标志使用示例

# Pull in all skia features and support for all backends (sdl2 and winit)
skulpin = "0"

# Pull in all skia features but not the winit app wrapper
skulpin = { version = "0", default-features = false, features = ["skia-complete"] }

# Pull in all skia features and include the winit app wrapper
skulpin = { version = "0", default-features = false, features = ["skia-complete", "winit-app"] }

skia-safe的上游版本控制

Skulpin可以使用许多版本的skia-safe进行构建和使用。为了方便库的用户,所需版本已被放宽。这允许新项目使用这些库的较新版本,同时不强迫旧项目更新。

您可以通过使用 cargo update

cargo update -p skia-safe --precise 0.32

文档

由于skia_safe存储库在构建时需要互联网连接(它将获取skia源代码或获取预构建的二进制文件),因此文档在docs.rs上无法构建。因此,查看文档的最佳方式是自己构建它们。

cargodoc -pskulpin --open

要求

最低要求的rust版本: 1.43.0

Windows

  • 如果您使用的是GNU工具链(MSVC是默认设置),则在构建curl时可能会遇到问题。(Curl是skia_safe绑定依赖项,用于下载预构建的skia二进制文件。)这里有一些 解决方案列表。再次强调,这只会影响您在运行非默认GNU工具链的情况下。
  • 如果您正在使用SDL2,请参阅SDL2绑定的要求。最简单的方法是使用“捆绑”和“静态”功能。为此,将以下代码添加到您的Cargo.toml中:sdl2 = { version = ">=0.33", features = ["bundled", "static-link"] }。这些功能在示例中默认启用。
  • 启用vulkan验证需要LunarG验证层和一个在您的PATH中可见的Vulkan库。一个简单的方法是使用LunarG Vulkan SDK

MacOS

  • 如果您正在使用SDL2,请参阅SDL2绑定的要求。最简单的方法是使用“捆绑”和“静态”功能。为此,将以下代码添加到您的Cargo.toml中:sdl2 = { version = ">=0.33", features = ["bundled", "static-link"] }。这些功能在示例中默认启用。
  • 启用vulkan验证需要LunarG验证层和一个在您的PATH中可见的Vulkan库。一个简单的方法是使用LunarG Vulkan SDK

Linux

  • 如果您正在使用SDL2,请参阅SDL2绑定的要求。最简单的方法是使用“捆绑”和“静态”功能。为此,将以下代码添加到您的Cargo.toml中:sdl2 = { version = ">=0.33", features = ["bundled", "static-link"] }。这些功能在示例中默认启用。
  • 在Linux上,您还需要链接到bz2、GL、fontconfig和freetype。
    • 在ubuntu上,您可以使用libbz2-devlibfreetype6-devlibfontconfig1-devlibgl-dev。 (以及libvulkan-dev以获取Vulkan SDK)
  • 启用vulkan验证需要LunarG验证层和一个在您的PATH中可见的Vulkan库。一个简单的方法是使用LunarG Vulkan SDK

其他平台

可能可以为移动平台构建此应用程序,但我还没有调查这一点。

关于高DPI显示器支持的一些建议

对于常见情况,您可以使用“逻辑”坐标在skia画布上绘制,而不用担心dpi/缩放问题。

内部,skia表面将与swapchain大小匹配,但这个大小不一定等于窗口的逻辑大小或物理大小。为了产生大小一致的结果,渲染器将在将其传递给您的绘制实现之前对skia画布应用一个缩放因子。

重要的配置选择

在配置应用程序运行时,您应该考虑以下几个主要选择

  • 坐标系 - 此库可以配置为使用几个不同的坐标系。
    • Logical - 使用逻辑坐标,这些坐标是应用了因子的像素,用于计数高分辨率显示器
    • Physical - 使用原始像素作为坐标
    • VisibleRange - 尝试将给定的范围适应到窗口中
    • FixedWidth - 使用给定的X范围和纵横比来计算Y范围
    • None - 不要修改画布矩阵
  • 展示模式 - 您可能希望使用Fifo(默认)或Mailbox
    • Fifo (VK_PRESENT_MODE_FIFO_KHR)是默认行为,并且始终存在于完全符合规范设备上。这将导致VSync,不应该出现屏幕撕裂,并且通常以显示刷新率运行。
    • Mailbox (VK_PRESENT_MODE_MAILBOX_KHR)将尽可能快地渲染。帧将被排队,并将绘制最新的完整帧。其他帧将被丢弃。这种渲染方法将产生最低的延迟,但并不总是可用,并且可能会对笔记本电脑和移动设备造成不必要的电池消耗。
    • 有关详细信息,请参阅prefer_fifo_present_mode/prefer_mailbox_present_mode以选择两个推荐选项之间的简单方法或present_mode_priority以获得完全控制。
    • 有关完整详情,请参阅PresentMode的文档和Vulkan规范。
  • 设备类型 - 最常见的设备类型将是专用或集成。默认情况下,如果可用,将选择专用设备。
    • Discrete (VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) - 如果可用,这可能是性能最好的设备
    • 集成 (VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU) - 这通常比独立显卡更节能。
    • 我认为同时拥有这两种情况最可能的情况是带有独立显卡的笔记本电脑。我预计优先使用集成显卡将对电池寿命更有利,但会牺牲一些性能。然而,我没有合适的设备来测试这一点。
    • 有关在两个推荐选项之间进行选择的简单方法,请参阅 prefer_integrated_gpu/prefer_discrete_gpu,或有关全面控制,请参阅 physical_device_type_priority
    • 有关完整详细信息,请参阅 PhysicalDeviceType 的文档和 Vulkan 规范。
  • Vulkan 调试层 - 默认情况下未启用调试日志记录
    • use_vulkan_debug_layer 用于打开/关闭所有日志
    • validation_layer_debug_report_flags 允许选择特定的日志级别
    • 如果未安装 Vulkan SDK,则启用任何 Vulkan 调试时应用程序将无法启动

许可证

根据您的选择许可

字体目录包含受其自身许可证保护的多个字体

sdl2 使用 zlib 许可证。

贡献

除非您明确声明,否则您提交给作品以供包含的任何贡献(如 Apache-2.0 许可证中定义的)将按上述方式双许可,而无需任何其他条款或条件。

请参阅 LICENSE-APACHELICENSE-MIT

依赖关系

~19–37MB
~737K SLoC