Skip to content

在 Slint 中,后端是封装与操作系统(特别是窗口子系统)交互的模块。多个后端可以被编译进 Slint,并在应用程序启动时在运行时选择一个使用。你可以配置一个不包含任何内置后端的 Slint,而通过实现 Slint 的平台抽象和窗口适配器接口来开发自己的后端。

后端的选择顺序如下:

  1. 开发者提供自己的后端并通过代码进行设置。
  2. 否则,若设置了 SLINT_BACKEND 环境变量,则根据该变量的值选择后端。
  3. 否则,按以下顺序依次尝试初始化各个后端:
    1. qt
    2. winit
    3. 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 后端
  • 提供公开的 RustC++ 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_8

plaintext

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/Developer

plaintext

  • 使用 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.31

plaintext

  • 在 Windows 上应用程序无法启动并立即退出

构建成功,但在 Windows 上运行 .exe 会立即终止,且没有任何错误信息。

这可能是由于缺少 MSVC 运行时库导致的。要解决此问题,请安装 Microsoft Visual C++ Redistributable package

基于 MIT 协议发布