在 Slint 中,后端是封装与操作系统(特别是窗口子系统)交互的模块。多个后端可以被编译进 Slint,并在应用程序启动时在运行时选择一个使用。你可以配置一个不包含任何内置后端的 Slint,而通过实现 Slint 的平台抽象和窗口适配器接口来开发自己的后端。
后端的选择顺序如下:
- 开发者提供自己的后端并通过代码进行设置。
- 否则,若设置了
SLINT_BACKEND环境变量,则根据该变量的值选择后端。 - 否则,按以下顺序依次尝试初始化各个后端:
- qt
- winit
- linuxkms
下表概述了内置后端。有关后端功能及其配置选项的更多信息,请参阅相应的子页面。
| 后端名称 | 描述 | 默认内置 |
|---|---|---|
| qt | 使用 Qt 库进行窗口系统集成、渲染和原生控件样式。 | 在 Linux 上若已安装 Qt |
| winit | 使用 winit 库与窗口系统交互。 | 是 |
| linuxkms | 使用 Linux 的 KMS/DRI 基础架构进行渲染,无需窗口系统或合成器。 | 否 |
后端还负责选择渲染器。概述请参阅 渲染器 一节。通过将名称附加到 SLINT_BACKEND 环境变量(以短横线分隔)可覆盖渲染器的选择。 例如,如果你想选择 winit 后端结合 software 渲染器,请设置 SLINT_BACKEND=winit-software。 类似地,SLINT_BACKEND=linuxkms-skia 选择 linuxkms 后端,然后指示 LinuxKMS 后端使用 Skia 进行渲染。
渲染器
Slint 提供不同的渲染器,它们使用不同的技术和库将你的元素场景转换为像素。Slint 会根据你选择的后端以及在 Slint 编译时所启用的功能来选取渲染器。
从源码构建 Slint 时,请检查 SLINT_FEATURE_RENDERER_* cmake 选项以启用可用的渲染器之一。
对于 Rust,请启用 renderer-* 功能之一。
对于 Node.js,所有渲染器都已内置于包中。
对于 Python,所有渲染器都已内置于包中。
Qt 渲染器
Qt 渲染器与 Qt 后端 一起提供,使用 QPainter 进行渲染:
- 软件渲染,无 GPU 加速。
- 仅在 Qt 后端中可用。
软件渲染器
- 可在任何平台运行,具有高度可移植性,且轻量。
- 软件渲染,无 GPU 加速。
- 支持局部渲染。
- 支持逐行渲染(仅 Rust)。
- 适用于微控制器。
- 部分功能尚未实现:
- 不支持旋转或缩放。
- 不支持
drop-shadow-*属性。 - 不支持在
clip: true组合下使用border-radius。 - 不支持文本描边/轮廓。
- 文本渲染目前仅限于西方文字。
- 在
no_std环境中使用Path元素需要启用software-renderer-path功能。 - 同样适用于
no_std环境以及 Winit 后端 和 LinuxKMS 后端。 - 提供公开的 Rust 和 C++ API。
FemtoVG 渲染器
- 高度可移植。
- 使用 OpenGL 进行 GPU 加速(必需)。当选作
renderer-femtovg-wgpu时,支持 Metal、Vulkan 和 Direct3D 的 GPU 加速。 - 文本和路径渲染质量有时不够理想。
- 可在 Winit 后端 和 LinuxKMS 后端 中使用。
- 提供公开的 Rust API。
Skia 渲染器
- 使用 OpenGL、Metal、Vulkan 和 Direct3D 进行成熟的 GPU 加速。
- 与其他渲染器相比,磁盘占用较大。
- 可在 Winit 后端 和 LinuxKMS 后端 中使用。
- 提供公开的 C++ API。
故障排除
启用 Skia 渲染器时你可能会遇到编译问题。以下各节记录了我们已知的问题及其解决方法。
在 Windows 上编译错误,提示有关多个源文件和未使用的链接器输入
你可能会看到来自 clang-cl 的如下错误和警告:
clang-cl: error: cannot specify '/Foobj/src/fonts/fontmgr_win.SkFontMgr_indirect.obj' when compiling multiple source files clang-cl: warning: Hausmann/.cargo/registry/src/index.crates.io-6f17d22bba15001f/skia-bindings-0.66.0/skia: 'linker' input unused [-Wunused-command-line-argument]plaintext
Skia 源码被检出到 Cargo(Rust 包管理器)所管理的路径中。当该路径包含空格时就会出现此错误。默认情况下,该路径位于 %HOMEPATH%\.cargo,当登录名包含空格时路径中就会含有空格。要解决此问题,请将 CARGO_HOME 环境变量设置为不含空格的路径,例如 c:\cargo_home。
为带硬件浮点支持的 ARMv7 编译时出错
你可能会看到包含如下信息的编译器错误:
Unable to generate bindings: ClangDiagnostic("/home/runner/work/slint/yocto-sdk/sysroots/cortexa15t2hf-neon-poky-linux-gnueabi/usr/include/gnu/stubs-32.h:7:11: fatal error: 'gnu/stubs-soft.h' file not found\n")plaintext
Skia 构建会在多处调用 clang,并且对影响浮点 ABI 的编译器标志(例如 -mfloat-abi=hard)很敏感,因为它们会影响头文件的查找。
解决方法是:设置 BINDGEN_EXTRA_CLANG_ARGS 环境变量,使其包含构建环境传递给 C++ 编译器的相同标志。
例如,如果你正在针对 Yocto SDK 进行构建,可以在 OECORE_TUNE_CCARGS 环境变量中找到这些标志。
在 Windows 上链接时出错
你可能会看到包含如下信息的编译器错误:
error: linking with `link.exe` failed: exit code: 1120 | ...= note: skunicode.lib(icu.SkLoadICU.obj) : error LNK2019: unresolved external symbol __std_init_once_begin_initialize_clr referenced in function "bool __cdecl SkLoadICU(void)" (?SkLoadICU@@YA_NXZ) ... skia.lib(skia.SkNWayCanvas.obj) : error LNK2001: unresolved external symbol __std_find_trivial_8plaintext
Skia 构建要求使用 Microsoft Visual Studio 2022 作为编译器。请确保已安装该编译器的最新补丁。
- 在 macOS 上编译错误:
构建失败,日志输出中某处会出现如下信息:
cargo:warning=xcrun: error: unable to lookup item 'PlatformVersion' from command line tools installationcargo:warning=xcrun: error: unable to lookup item 'PlatformVersion' in SDK '/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk'plaintext
这是因为构建过程会调用 xcrun --show-sdk-platform-version 来确定 SDK 版本,但 Xcode 命令行工具不支持该操作。要解决此问题,请一次性运行以下命令:
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developerplaintext
- 使用 Yocto 交叉编译时编译错误:
构建失败,日志末尾附近会出现如下信息:
error occurred: unknown target `arm-org-linux-gnueabi`plaintext
这是 cc crate 的更新与 Skia Rust 绑定使用方式之间的一个不幸组合所导致的。我们预计将在未来的版本中解决此问题。在此期间,你可以通过在 Cargo.lock 文件中将 cc crate 降级来解决此问题:
cargo update -p cc --precise 1.1.31plaintext
- 在 Windows 上应用程序无法启动并立即退出
构建成功,但在 Windows 上运行 .exe 会立即终止,且没有任何错误信息。
这可能是由于缺少 MSVC 运行时库导致的。要解决此问题,请安装 Microsoft Visual C++ Redistributable package