11个版本 (7个破坏性更新)
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.3.0 | 2020年3月24日 |
#307 在 渲染
每月24次下载
在 skulpin 中使用
86KB
2K SLoC
skulpin
Skia + Vulkan = Skulpin
此包通过结合vulkan和skia,提供了一种绘制硬件加速2D图形的简单选项。
请注意在开始使用前此包的状态。
此包主要依赖于
注意:有关如何获取skia二进制文件的更多信息,请参阅skia-bindings。在许多情况下,此包将下载由其项目CI创建的二进制文件。
此包与raw-window-handle集成,这使得它可以与sdl2、winit以及其他支持raw-window-handle的任何窗口框架一起使用。
运行示例
首先,确保满足以下系统要求。然后,可以正常运行示例。
交互式示例(interactive)是查看如何轻松获取键盘/鼠标输入的好方法。
# winit 0.24
cargo run --example interactive_winit_app --features winit-app,winit-25
# sdl2
cargo run --example interactive_sdl2
物理演示(physics)也非常有趣。
cargo run --example physics --features winit-app,winit-25
以下是一个物理和交互示例的视频。
状态
我不再使用这个crate进行任何事情,因此只会以非常基础的方式维护这个crate。我将审查简单的pull请求,并在已打开的问题上提供建议。然而,我可能会在任何时候完全关闭这个仓库,尤其是如果crate停止工作并且需要更多非平凡的改变来修复时。不幸的是,我在开源项目上的时间有限,所以我希望将重点放在我认为对我个人来说最有意思的crate上。我愿意将crate的所有权转让给那些提交过几个PR并证明自己值得信赖的人,如果有人创建分支,我会很高兴提供链接。
用法
目前有两种方式可以与winit
一起使用这个库。
- 应用 - 实现AppHandler trait并启动应用。这很简单,但不够灵活。目前仅支持使用winit。
- 仅渲染器 - 您自己管理窗口和事件循环。然后添加渲染器以在其中绘制。窗口应包裹在
skulpin::Window
的实现中。已提供sdl2
和winit
的实现。
如果您喜欢sdl2
,则需要直接使用渲染器。请参阅仅sdl2渲染器
请务必安装适合您平台的以下先决条件!(请参阅“要求”)
特性标志
Skia相关特性
skia-complete
- 包括以下所有Skia特性。** 默认启用 **skia-shaper
- 启用Harfbuzz和ICU的文本形状skia-svg
- 此特性启用SVG渲染后端skia-textlayout
- 使Skia模块skparagraph可用,其中包含用于段落布局的类型- 有关这些标志的更多信息,请参阅skia-safe的README
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
文档
文档在docs.rs上构建失败,因为skia_safe软件包需要网络连接才能构建。(它将抓取skia源代码或抓取预构建的二进制文件。)因此,查看文档的最佳方式是自行构建。
cargodoc -pskulpin --打开
要求
最小支持的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 规范。
- 设备类型 - 最常见的设备类型将是专用或集成。默认情况下,如果可用,将选择专用设备。
Discrete
(VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU
) - 当可用时,这可能是性能最佳的设备Integrated
(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 License,版本 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。
依赖关系
~19–41MB
~753K SLoC