9个不稳定版本 (4个重大更新)
0.5.1 | 2021年1月27日 |
---|---|
0.5.0 | 2020年11月3日 |
0.4.1 | 2021年1月26日 |
0.4.0 | 2020年9月12日 |
0.1.0 | 2020年3月3日 |
#20 in #ash
每月163次下载
43KB
863 行
skulpin
Skia + Vulkan = Skulpin
该软件包通过结合vulkan和skia,为硬件加速的2D绘制提供了一个简单选项。
请注意在使用此软件包之前软件包的状态。
此软件包主要依赖于
注意:有关如何获取skia二进制文件的更多信息,请参阅skia-bindings。在许多情况下,此软件包将下载由其项目CI创建的二进制文件。
此软件包与raw-window-handle集成,允许它与其他支持raw-window-handle的窗口框架(如sdl2和winit)一起使用。
运行示例
首先,确保满足以下操作系统的要求。之后,可以正常运行示例。
有关如何获取键盘/鼠标输入的简单方法,可以查看交互示例。
# 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
以下是物理和交互示例的视频。
状态
我不再使用此软件包进行任何事情,因此将仅以非常基础的维护方式维护此软件包。我将审查简单的拉取请求并在开放的问题上提供建议。但是,我可能在任何时候完全关闭此存储库,尤其是如果软件包停止工作并且需要超出常规的更改来修复。遗憾的是,我在开源项目上的时间有限,因此我希望将其集中在我认为最有趣的项目上。我愿意将软件包的所有权转让给已经提交了一些PR并表现出可信度的某人,并且如果有人创建分支,我将很高兴提供链接。
用法
目前有两种方法可以在winit
中使用此库。
- app - 实现 AppHandler 特性并启动应用。这很简单,但灵活性不高。目前仅在 winit 中支持。
- 仅渲染器 - 您自己管理窗口和事件循环。然后添加渲染器以绘制到窗口中。窗口应包装在
skulpin::Window
的实现中。提供了sdl2
和winit
的实现。
如果您更喜欢 sdl2
,则需要直接使用渲染器。请参阅 仅 sdl2 渲染器
不要忘记安装适用于您平台的先决条件!(请参阅“需求”)
特性标志
Skia 相关特性
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 crate 中的名称匹配。)
特性标志使用示例
# 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
强制使用特定版本的 skia safe
cargo update -p skia-safe --precise 0.32
文档
由于 skia_safe crate 需要互联网连接进行构建,因此文档在 docs.rs 上无法构建。(它将获取 skia 源代码或获取预构建的二进制文件。)因此,查看文档的最佳方式是自行构建。
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-dev
、libfreetype6-dev
、libfontconfig1-dev
和libgl-dev
。 (以及libvulkan-dev
以获取 Vulkan SDK)
- 在 ubuntu 上,您可以使用
- 启用 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 规范。
- 设备类型 - 最常见的设备类型将是专用或集成。默认情况下,当可用时,将选择专用设备。
离散
(VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU
) - 当可用时,这可能是性能最佳的设备集成
(VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU
) - 这通常比离散GPU更节能。- 我认为同时拥有这两种情况最有可能的情况是带有离散GPU的笔记本电脑。我预计优先考虑集成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 调试时应用程序将无法启动
许可
根据您的选择许可
- Apache 许可证版本 2.0,(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
字体目录包含受各自许可权保护的多个字体
- Feather, MIT
- Material Design Icons, SIL OFL 1.1
- FontAwesome 4.7.0,可在 SIL OFL 1.1 下使用
mplus-1p-regular.ttf
,可在其自己的许可权下使用。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义,您有意提交给作品的所有贡献都应双重许可,如上所述,无任何额外条款或条件。
请参阅 LICENSE-APACHE 和 LICENSE-MIT。
依赖项
~11–31MB
~523K SLoC