Skip to content

后端与渲染器

在 Slint 中,后端(backend)是封装与操作系统(尤其是窗口子系统)交互的模块。 多个后端可以编译进 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 编译时选择的 feature 来挑选渲染器。

使用 Rust 时,启用其中一个

renderer-*

feature。

Qt 渲染器随 Qt 后端 一起提供,并使用 QPainter 渲染:

  • 软件渲染,无 GPU 加速。
  • 仅在 Qt 后端中可用。
  • 可在任何地方运行,可移植性高且轻量。
  • 软件渲染,无 GPU 加速。
  • 支持局部渲染。
  • 支持逐行渲染(仅 Rust)。
  • 适用于微控制器。
  • 有些特性尚未实现:
    • 不支持旋转或缩放。
    • 不支持 drop-shadow-* 属性。
    • 不支持 border-radius 与 clip: true 组合使用。
    • 不支持文本描边/轮廓。
  • 文本渲染目前限于西方文字。
  • 在 no_std 环境中的 Path 元素需要启用 software-renderer-path feature。
  • 可在 no_std 环境中使用,也可在 Winit 后端 和 LinuxKMS 后端 中使用。
  • 公开的 Rust 和 C++ API。
  • 可移植性高。
  • 使用 OpenGL 的 GPU 加速(必需)。当选择为 renderer-femtovg-wgpu 时,使用 Metal、Vulkan 和 Direct3D 的 GPU 加速。
  • 文本和路径渲染质量有时不够理想。
  • 可在 Winit 后端 和 LinuxKMS 后端 中使用。
  • 公开的 Rust API。
  • 通过 Vello 在 WGPU 上的计算管线,实现使用 Metal、Vulkan 和 Direct3D 的 GPU 加速。
  • 实验性:它从不会被自动选中,即使它是唯一编译进来的渲染器时也是如此。 通过设置 SLINT_BACKEND=winit-vello 或 SLINT_BACKEND=linuxkms-vello 来选择它。
  • 需要支持计算着色器的 GPU。没有软件回退。
  • 可在 Winit 后端 和 LinuxKMS 后端 中使用。
  • 使用 OpenGL、Metal、Vulkan 和 Direct3D 的精巧 GPU 加速。
  • 与其他渲染器相比,磁盘占用较大。
  • 可在 Winit 后端 和 LinuxKMS 后端 中使用。
  • 公开的 C++ API。

启用 Skia 渲染器时,你可能会遇到编译问题。以下各节记录了我们 已知的问题以及如何解决它们。

在 Windows 上编译出错,消息涉及多个源文件和未使用的链接器输入
Section titled “在 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 源代码被检出到由 Rust 包管理器 Cargo 管理的路径中。 当该路径包含空格时就会发生这个错误。默认情况下它位于 %HOMEPATH%\.cargo, 如果登录名包含空格,该路径就会包含空格。要解决这个问题,请把 CARGO_HOME 环境变量设置为一个不含空格的路径,例如 c:\cargo_home。

在 Windows 上编译出错,文件名称过长
Section titled “在 Windows 上编译出错,文件名称过长”

当从源代码构建 Skia 时,你可能会看到这个错误:

GetFullPathNameA(../../../../../../../../cargo/registry/src/index.crates.io-1949cf8c6b5b557f/skia-bindings-0.99.0/skia/third_party/externals/harfbuzz/src/...): The filename or extension is too long.
ninja: build stopped: subcommand failed.
plaintext

Skia 构建使用一个限制为 260 个字符的 Windows API 来解析编译器报告的 include 路径, 并且是相对于构建目录来解析它们。Cargo 目标目录或 CARGO_HOME 的深层路径 超出了该限制。要解决这个问题,请把两者都移动到 接近驱动器根目录的位置:将 CARGO_TARGET_DIR 环境变量设置为 c:\t, 并将 CARGO_HOME 环境变量设置为 c:\cargo_home。

为带硬件浮点支持的 ARMv7 编译时出错
Section titled “为带硬件浮点支持的 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 环境变量中找到这些标志。

你可能会看到包含以下消息的编译错误:

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 作为编译器。请确保安装了编译器的 最新补丁。

构建失败,并且在日志输出的某处你会看到这条消息:

cargo:warning=xcrun: error: unable to lookup item 'PlatformVersion' from command line tools installation
cargo: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

构建失败,并且你在日志中看到这条消息:

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 上无法启动,而是立即退出
Section titled “应用程序在 Windows 上无法启动,而是立即退出”

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

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


© 2026 SixtyFPS GmbH