5个版本 (重大更新)

使用旧Rust 2015

0.5.0 2023年9月11日
0.4.0 2023年6月5日
0.2.0 2023年6月5日
0.1.0 2023年6月5日
0.0.1 2023年4月14日

#28 in 渲染

每月24次下载
bigshot 中使用

MIT 许可证

770KB
16K SLoC

SDL3-RS 构建状态 crates.io 徽章

Rust中的SDL3绑定。工作中。

概述

这是从Rust使用SDL3的接口。

使用Rust代码包装了低级的C组件,使其更符合习惯并抽象出不适当的手动内存管理。

sdl3-rs使用MIT许可证。

这是Rust-sdl2的分支,根据SDL2->SDL3迁移指南进行迁移。

如果您需要一个与早期SDL版本兼容的库,请参阅此处Rust-sdl2

文档

以下功能在文档中启用

  • gfx
  • image
  • mixer
  • ttf

unsafe_textures 功能未在网络上进行文档说明,您可以使用 cargo doc 生成具有此功能的自定义文档。

需求

Rust

我们目前针对Rust的最新稳定版本。

SDL3.0开发库

SDL3仍在开发中,因此请不要期望稳定性。

“捆绑”功能

这个包支持一个名为“捆绑”的功能,该功能从源代码编译SDL3并自动链接。虽然这应该适用于任何架构,但您必须有一个C编译器(如 gccclang 或 MS 自带的编译器)才能正确使用此功能。

默认情况下,macOS 和 Linux 只从系统目录(如 /usr/lib)加载库。如果您希望将新构建的 libsdl3.so/libsdl3.dylib 与您的可执行文件一起分发,您需要将 rpath 添加到您的可执行文件中。将以下行添加到 build.rs 脚本中

#[cfg(target_os="macos")]
println!("cargo:rustc-link-arg=-Wl,-rpath,@loader_path");

#[cfg(target_os="linux")]
println!("cargo:rustc-link-arg=-Wl,-rpath,$ORIGIN");

Linux

通过您喜欢的包管理工具安装这些,或者通过 http://www.libsdl.org/

Ubuntu 示例

sudo apt-get install libsdl3-dev

Fedora 示例

sudo dnf install sdl3-devel

Arch 示例
(Arch 没有单独的常规和开发包,所有内容都是一起的。)

sudo pacman -S sdl3

您可能还需要一个C编译器(gcc)。

Linux 中的静态链接

您可以选择使用 static-link 功能将 sdl3 静态链接而不是动态链接。在 Linux 上,您还需要执行以下操作之一

  • 使用 bundled 功能
  • 使用 use-pkgconfig 功能,以便 rustc 知道在哪里查找您的 sdl3 库及其静态链接的依赖项。这是必需的,因为没有内置的方法来查找从系统中静态链接 sdl3 所需的资源
  • 使用 vcpkg 安装开发库。使用 vcpkg 在 Linux 和其他操作系统上生成静态二进制文件的说明请见此处

macOS

Homebrew

在 macOS 上,通过 homebrew 安装这些是个好主意。

brew install sdl3

在 Homebrew 的最新版本中,安装的库通常链接到 $(brew --prefix)/lib。如果您正在运行较旧版本,SDL 的符号链接可能位于 /usr/local/lib

为了使链接 Homebrew 安装的库更容易,请根据您的 shell 执行以下操作。

根据您是否使用 ZSH 或 Bash,将此行添加到您的 ~/.zshenv~/.bash_profile 中。

export LIBRARY_PATH="$LIBRARY_PATH:$(brew --prefix)/lib"

MacPorts

您也可以通过 macports 获取 sdl3。

sudo port install libsdl3

然后,如果尚未存在,将以下内容添加到您的 ~/.bash_profile 中。

export LIBRARY_PATH="$LIBRARY_PATH:/opt/local/lib/"

如果您在使用 Homebrew 或 MacPorts 时遇到问题,请查看此处

如果您正在使用 sdl3 框架

您可以从 https://www.libsdl.org/download-2.0.php 下载并安装 sdl3 Mac OS X 框架。

要使 sdl3 包与 sdl3 框架链接,您需要启用 use_mac_framework 功能。要使用此功能构建和测试 sdl3 包,请使用

cargo test --features use_mac_framework

要启用此功能依赖 sdl3 包,请在您的项目的 Cargo.toml 文件中添加以下内容

[dependencies.sdl3]
features = ["use_mac_framework"]
version = ...  # Whichever version you are using

或者,您可以通过在 Cargo.toml 文件中放置以下内容来在您的包中重新导出此功能

[features]
default = []
use_sdl3_mac_framework = ["sdl3/use_mac_framework"]

使用 vcpkg 在 macOS 上进行静态链接

使用 vcpkg 在 macOS 和其他操作系统上生成静态二进制的说明在此

Windows (MSVC)

  1. http://www.libsdl.org/ 下载 MSVC 开发库 (sdl3-devel-3.0.x-VC.zip)。

  2. 将 sdl3-devel-3.0.x-VC.zip 解压到您选择的文件夹中(之后您可以删除它)。

  3. 将以下文件夹中的所有 lib 文件复制到:

    sdl3-devel-3.0.x-VC\sdl3-3.0.x\lib\x64\

    到:

    C:\Program Files\Rust\lib\rustlib\x86_64-pc-windows-msvc\lib

    或者复制到您选择的库文件夹中,并确保您有一个系统环境变量

    LIB = C:\your\rust\library\folder

    Rustup 用户请注意,此文件夹位于

    C:\Users\{您的用户名}\.rustup\toolchains\{当前工具链}\lib\rustlib\{当前工具链}\lib

当前工具链可能是 stable-x86_64-pc-windows-msvc

  1. 将 sdl3.dll 从

    sdl3-devel-3.0.x-VC\sdl3-3.0.x\lib\x64\

    复制到您的 cargo 项目中,紧挨着 Cargo.toml。

  2. 当您发布游戏时,请确保将 sdl3.dll 复制到与编译好的 exe 文件相同的目录,否则游戏无法启动。

使用 MSVC 进行静态链接

http://libsdl.org/ 提供的 MSVC 开发库不包含静态库。这意味着,如果您想使用 windows-msvc 工具链的 static-link 功能,您必须执行以下操作之一:

  • 自己构建一个 sdl3 静态库并将其复制到工具链的 lib 目录;或者
  • 同时启用 bundled 功能,这将为您构建一个静态库;或者
  • 使用下面描述的 vcpkg 中的静态 sdl3 库。

Windows (MinGW)

  1. http://www.libsdl.org/ 下载 mingw 开发库 (sdl3-devel-2.0.x-mingw.tar.gz)。

  2. 解压到您选择的文件夹中(之后您可以删除它)。

  3. 将以下文件夹中的所有 lib 文件复制到:

    sdl3-devel-2.0.x-mingw\sdl3-3.0.x\x86_64-w64-mingw32\lib

    到(对于 Rust 1.6 及以上版本)

    C:\Program Files\Rust\lib\rustlib\x86_64-pc-windows-gnu\lib

    或者(对于 Rust 版本 1.5 及以下)

    C:\Program Files\Rust\bin\rustlib\x86_64-pc-windows-gnu\lib

    或者复制到您选择的库文件夹中,并确保您有一个系统环境变量

    LIBRARY_PATH = C:\your\rust\library\folder

    Rustup 用户请注意,此文件夹位于

    C:\Users\{您的用户名}\.rustup\toolchains\{当前工具链}\lib\rustlib\{当前工具链}\lib

当前工具链可能是 stable-x86_64-pc-windows-gnu

  1. 将 sdl3.dll 从

    sdl3-devel-3.0.x-mingw\sdl3-3.0.x\x86_64-w64-mingw32\bin

    复制到您的 cargo 项目中,紧挨着 Cargo.toml。

  2. 当您发布游戏时,请确保将 sdl3.dll 复制到与编译好的 exe 文件相同的目录,否则游戏无法启动。

使用 MinGW 进行静态链接

如果您想使用 windows-gnu 工具链的 static-link 功能,则需要以下库

libimm32.a
libversion.a
libdinput8.a
libdxguid.a

这些文件目前没有包含在 windows-gnu 工具链中,但可以从此处下载。对于 x86_64 工具链,您需要 x86_64-win32-seh 包,对于 i686 您需要 i686-win32-dwarf 包。

您可以在以下位置找到上述库:mingw64/x86_64-w64-mingw32/lib/(对于 x86_64)或 mingw32/i686-w64-mingw32/lib/(对于 i686)。将它们复制到您的工具链的 lib 目录(与您复制 SDL .a 文件的目录相同)。

带有构建脚本的 Windows

  1. http://www.libsdl.org/ 下载 mingw 和 msvc 开发库 (sdl3-devel-2.0.x-mingw.tar.gz & sdl3-devel-2.0.x-VC.zip)。
  2. 解压到您选择的文件夹中(之后您可以删除它)。
  3. 在 Cargo.toml 所在的同级目录中创建以下文件夹结构
gnu-mingw\dll\32
gnu-mingw\dll\64
gnu-mingw\lib\32
gnu-mingw\lib\64
msvc\dll\32
msvc\dll\64
msvc\lib\32
msvc\lib\64
  1. 将源存档中的 lib 和 dll 文件复制到步骤 3 中创建的目录中,如下所示
sdl3-devel-2.0.x-mingw.tar.gz\sdl3-2.0.x\i686-w64-mingw32\bin 		-> 	gnu-mingw\dll\32
sdl3-devel-2.0.x-mingw.tar.gz\sdl3-2.0.x\x86_64-w64-mingw32\bin 	-> 	gnu-mingw\dll\64
sdl3-devel-2.0.x-mingw.tar.gz\sdl3-2.0.x\i686-w64-mingw32\lib 		-> 	gnu-mingw\lib\32
sdl3-devel-2.0.x-mingw.tar.gz\sdl3-2.0.x\x86_64-w64-mingw32\lib 	-> 	gnu-mingw\lib\64
sdl3-devel-2.0.8-VC.zip\sdl3-2.0.x\lib\x86\*.dll	 		-> 	msvc\dll\32
sdl3-devel-2.0.8-VC.zip\sdl3-2.0.x\lib\x64\*.dll 			-> 	msvc\dll\64
sdl3-devel-2.0.8-VC.zip\sdl3-2.0.x\lib\x86\*.lib	 		-> 	msvc\lib\32
sdl3-devel-2.0.8-VC.zip\sdl3-2.0.x\lib\x64\*.lib	 		-> 	msvc\lib\64
  1. 如果您还没有构建脚本,请创建一个构建脚本,将以下内容放入 Cargo.toml 中的 [package]

    build = "build.rs"

  2. 在 Cargo.toml 所在的同级目录中创建一个名为 build.rs 的文件(如果您还没有构建脚本),并将以下内容粘贴到其中

use std::env;
use std::path::PathBuf;

fn main() {
    let target = env::var("TARGET").unwrap();
    if target.contains("pc-windows") {
        let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
        let mut lib_dir = manifest_dir.clone();
        let mut dll_dir = manifest_dir.clone();
        if target.contains("msvc") {
            lib_dir.push("msvc");
            dll_dir.push("msvc");
        }
        else {
            lib_dir.push("gnu-mingw");
            dll_dir.push("gnu-mingw");
        }
        lib_dir.push("lib");
        dll_dir.push("dll");
        if target.contains("x86_64") {
            lib_dir.push("64");
            dll_dir.push("64");
        }
        else {
            lib_dir.push("32");
            dll_dir.push("32");
        }
        println!("cargo:rustc-link-search=all={}", lib_dir.display());
        for entry in std::fs::read_dir(dll_dir).expect("Can't read DLL dir")  {
            let entry_path = entry.expect("Invalid fs entry").path();
            let file_name_result = entry_path.file_name();
            let mut new_file_path = manifest_dir.clone();
            if let Some(file_name) = file_name_result {
                let file_name = file_name.to_str().unwrap();
                if file_name.ends_with(".dll") {
                    new_file_path.push(file_name);
                    std::fs::copy(&entry_path, new_file_path.as_path()).expect("Can't copy from DLL dir");
                }
            }
        }
    }
}
  1. 在构建时,构建脚本会将所需的DLL文件复制到与您的Cargo.toml相同的目录中,但您可能不想将这些文件提交到任何Git仓库,因此请将以下行添加到您的.gitignore文件中

/*.dll

  1. 当您发布游戏时,请确保将相应的sdl3.dll复制到与您的编译exe文件相同的目录中,否则游戏无法启动。

现在,您的项目应该可以在任何Windows计算机上构建和运行了!

Windows (MSVC with vcpkg)

  1. 安装MS构建工具vcpkg
  2. 安装所需的sdl3库:vcpkg.exe install sdl3-ttf:x64-windows sdl3:x64-windows
  3. 打开x64本地工具提示(VS 2019的x64 Native Tools Command Prompt)
  4. 设置环境变量
SET PATH=%PATH%;C:\Users\my_user\dev\vcpkg\installed\x64-windows\bin
SET INCLUDE=%INCLUDE%;C:\Users\my_user\dev\vcpkg\installed\x64-windows\include
SET LIB=%LIB%;C:\Users\my_user\dev\vcpkg\installed\x64-windows\lib
  1. cargobuild

Windows、Linux和macOS with vcpkg

获取开发库的另一种方法是使用vcpkg。要将项目设置为在Windows(MSVC)、Linux或macOS上构建静态二进制文件,可以像这样构建

cargo install cargo-vcpkg
cargo vcpkg build
cargo build

将以下内容添加到您的Cargo.toml

[dependencies.sdl3]
version = "0.0.1"
default-features = false
features = ["ttf","image","gfx","mixer","static-link","use-vcpkg"]

[package.metadata.vcpkg]
dependencies = ["sdl3", "sdl3-image[libjpeg-turbo,tiff,libwebp]", "sdl3-ttf", "sdl3-gfx", "sdl3-mixer"]
git = "https://github.com/microsoft/vcpkg"
rev = "261c458af6e3eed5d099144aff95d2b5035f656b"

[package.metadata.vcpkg.target]
x86_64-pc-windows-msvc = { triplet = "x64-windows-static-md" }

有关cargo vcpkg工具的更多信息,请参阅此处

安装

如果您正在使用cargo来管理您的项目,您可以通过Crates.io下载

    [dependencies]
    sdl3 = "0.0.1"

或者,从GitHub拉取以获取master的最新版本

    [dependencies.sdl3]
    git = "https://github.com/revmischa/sdl3-rs"

否则,克隆此仓库并运行cargo

cargo build

您可以通过添加以下内容来启用ttf、image、gfx和mixer等特性

    [dependencies.sdl3]
    version = "0.0.1"
    default-features = false
    features = ["ttf","image","gfx","mixer"]

这些特性需要它们各自的库,可以在以下位置找到:(安装过程与sdl3相同)

关于sdl3_net呢?

目前,与诸如serdebincode等其他crate相比,sdl3_net没有意义。我们强烈建议使用它们来开发任何UDP或TCP相关的内容(以及标准库中的futures或TCP/UDP)。

如果您仍然想要sdl3_net的实现,您可以通过Pull Request将此repo作为功能添加。此绑定的一个较旧版本可以在此处找到

示例

我们包含了一些简单的示例项目

cargo run --example demo

您可以在examples/文件夹中查看完整的列表。某些示例需要一些特性,您可以通过以下方式启用它们

cargo run --example gfx-demo --features "gfx"

将“gfx”替换为您想要示例需要的特性。

关于unsafe_textures特性

sdl3::render模块中,Texture默认具有生命周期,以防止其比其父级TextureCreator存活时间更长。这些生命周期有时在Rust中很难处理,因此您可以选择启用unsafe_textures特性。

这移除了Texture上的生命周期,但代价是可选的手动内存管理。如果您想手动销毁您使用的Texture,可以调用您的Texturedestroy方法,但请注意,如果没有任何父级(CanvasTextureCreator)是活跃的,则不应调用此方法。如果您不调用此方法,内存将在最后一个Canvas或最后一个TextureCreator被释放时自动释放。

此功能没有在线文档,但是您可以在自己的项目中通过在Cargo.toml中启用该功能、运行cargo doc和通过浏览器访问target/doc/sdl3/index.html来自行构建。

使用bindgen生成sdl3-sys

为此crate生成的sdl3-sys非常通用,可以在许多平台上使用,限制很少。然而,当使用sdl3的特定平台功能时,例如窗口管理器类别,您有时可能会遇到麻烦。

"use-bindgen"功能允许您通过根据您的目标生成适当的绑定来避免这种限制。如果启用了"使用-pkg-config"功能,它将根据pkg-config输出的内容(如果启用了"使用-pkg-config"功能)获取头文件并基于这些头文件生成绑定。如果没有pkg-config或禁用了此功能,它将尝试获取此crate的SDL-2.0.8/include中的头文件。

如果您有希望使用自己的头文件(使用beta版本、旧版本等),可以设置环境变量"sdl3_INCLUDE_PATH",那些头文件将被bindgen使用。

使用sdl3-sys提供sdl3头文件/库

如果您正在为需要sdl3的库创建一个*-syscrate,您可以使用sdl3-sys提供编译好的库和sdl3的头文件。

按照以下步骤获取头文件目录。在您的crate的Cargo.toml中添加sdl3-sys作为依赖项(而不是构建依赖项)。然后Cargo将为您的构建脚本提供一个环境变量DEP_sdl3_INCLUDE,其中包含sdl3的头文件目录。如果有多个目录,它们将使用:作为分隔符组合。将这些目录传递给构建C/C++的任何工具。

一切链接完成后,所有C、C++和Rust代码都将使用单个sdl3(由sdl3-sys提供的sdl3)。

有关更多讨论,请参阅相应的问题

OpenGL

使用OpenGL有两种方式

  • 作为sdl3::render的后端,其中所有操作都由sdl3为您完成。这是Linux设备的默认设置。
  • 手动使用,仅将sdl3作为窗口的"外壳"(类似于glutinwinitcrate),并仍然使用sdl3的摇杆、事件、音频、文本输入等能力。

如果您想使用OpenGL,还需要gl-rs包。如果您使用cargo,只需将这些行添加到您的Cargo.toml文件中

    [dependencies.gl]
    git = "https://github.com/bjz/gl-rs"

使用sdl3有两种使用OpenGL的方式

  • 使用Canvas与OpenGL一起使用,并使用sdl3::render
  • 直接在"窗口外壳"上使用OpenGL,并使用手动OpenGL调用进行渲染

使用sdl3::render

首先,从SDL找到OpenGL驱动程序

fn find_sdl_gl_driver() -> Option<u32> {
    for (index, item) in sdl3::render::drivers().enumerate() {
        if item.name == "opengl" {
            return Some(index as u32);
        }
    }
    None
}

fn main() {
    let sdl_context = sdl3::init().unwrap();
    let video_subsystem = sdl_context.video().unwrap();
    let window = video_subsystem.window("Window", 800, 600)
        .opengl() // this line DOES NOT enable opengl, but allows you to create/get an OpenGL context from your window.
        .build()
        .unwrap();
    let canvas = window.into_canvas()
        .index(find_sdl_gl_driver().unwrap())
        .build()
        .unwrap();

    // ...
}

如果您不打算通过gl-rscrate使用OpenGL调用,您可以停止在这里。sdl3将自动使用OpenGL后端

如果您打算在sdl3调用之间添加自己的调用,您需要首先使用画布的上下文


// initialization
gl::load_with(|name| video_subsystem.gl_get_proc_address(name) as *const _);

// sdl::render creates a context for you, if you use a Canvas you need to use it.
canvas.window().gl_set_context_to_current();

// ... in the main loop ...
unsafe {
    gl::ClearColor(0.6, 0.0, 0.8, 1.0);
    gl::Clear(gl::COLOR_BUFFER_BIT);
}
canvas.present();

但是要小心,sdl3 有自己的内部状态,你应该避免去干扰它。避免在 sdl3 调用中间使用手动 OpenGL,或者确保恢复先前的状态。

手动使用 OpenGL 调用

extern crate sdl3;
extern crate gl;

use sdl3::event::Event;
use sdl3::keyboard::Keycode;
use sdl3::video::GLProfile;

fn main() {
    let sdl_context = sdl3::init().unwrap();
    let video_subsystem = sdl_context.video().unwrap();

    let gl_attr = video_subsystem.gl_attr();
    gl_attr.set_context_profile(GLProfile::Core);
    gl_attr.set_context_version(3, 3);

    let window = video_subsystem.window("Window", 800, 600)
        .opengl()
        .build()
        .unwrap();

    // Unlike the other example above, nobody created a context for your window, so you need to create one.
    let ctx = window.gl_create_context().unwrap();
    gl::load_with(|name| video_subsystem.gl_get_proc_address(name) as *const _);

    debug_assert_eq!(gl_attr.context_profile(), GLProfile::Core);
    debug_assert_eq!(gl_attr.context_version(), (3, 3));

    let mut event_pump = sdl_context.event_pump().unwrap();

    'running: loop {
        unsafe {
            gl::ClearColor(0.6, 0.0, 0.8, 1.0);
            gl::Clear(gl::COLOR_BUFFER_BIT);
        }

        window.gl_swap_window();
        for event in event_pump.poll_iter() {
            match event {
                Event::Quit {..} | Event::KeyDown { keycode: Some(Keycode::Escape), .. } => {
                    break 'running
                },
                _ => {}
            }
        }
        ::std::thread::sleep(::std::time::Duration::new(0, 1_000_000_000u32 / 60));
    }
}

如上所述,当你不关心 sdl3 的渲染功能,但关心其音频、控制器和其他 neat 功能时,这个方法很有用。

你不必担心与 sdl3 或你不喜欢的版本纠缠的状态:sdl3 从不会在 render 模块之外调用任何 OpenGL 函数。

Vulkan

要使用 Vulkan,你需要 Rust 的 Vulkan 库。此示例使用的是 Vulkano 库。其他库可能对原始 Vulkan 对象句柄使用不同的数据类型。与这些库交互的 sdl3 Vulkan 函数的接口将因每个库而异。

extern crate sdl3;
extern crate vulkano;

use sdl3::event::Event;
use sdl3::keyboard::Keycode;
use std::sync::Arc;
use vulkano::instance::{Instance, InstanceCreateInfo, InstanceExtensions};
use vulkano::swapchain::{Surface, SurfaceApi};
use vulkano::{Handle, VulkanLibrary, VulkanObject};

fn main() {
    let sdl_context = sdl3::init().unwrap();
    let video_subsystem = sdl_context.video().unwrap();

    let window = video_subsystem
        .window("Window Title - My Vulkano-sdl3 application", 1024, 768)
        .vulkan()
        .build()
        .unwrap();

    let instance_extensions =
        InstanceExtensions::from_iter(window.vulkan_instance_extensions().unwrap());

    let instance = Instance::new(VulkanLibrary::new().unwrap(), {
        let mut instance_info = InstanceCreateInfo::application_from_cargo_toml();
        instance_info.enabled_extensions = instance_extensions;
        instance_info
    })
        .unwrap();

    let surface_handle = window
        .vulkan_create_surface(instance.handle().as_raw() as _)
        .unwrap();

    // SAFETY: that's just the way it is
    let surface = unsafe {
        Surface::from_handle(
            Arc::clone(&instance),
            <_ as Handle>::from_raw(surface_handle),
            SurfaceApi::Xlib,
            None,
        )
    };

    let mut event_pump = sdl_context.event_pump().unwrap();

    'running: loop {
        for event in event_pump.poll_iter() {
            match event {
                Event::Quit { .. }
                | Event::KeyDown {
                    keycode: Some(Keycode::Escape),
                    ..
                } => {
                    break 'running;
                }
                _ => {}
            }
        }
        ::std::thread::sleep(::std::time::Duration::new(0, 1_000_000_000u32 / 60));
    }
}


原始窗口句柄支持

可以使用特征名称启用 raw-window-handle

[dependencies.sdl3]
version = "0.0.1"
features = ["raw-window-handle"]

还有一个使用 wgpu 的工作示例

cargo run --example raw-window-handle-with-wgpu --features raw-window-handle

macOS 上的 sdl3 和原始窗口句柄

在 macOS 上,RawWindowHandle.ns_view 字段返回 null。消费 RawWindowHandle 的库(如 wgpu)应确定一个合理的默认值用于 ns_view。如果没有这样做,请在关联的项目中提交一个问题。

Android 上的原始窗口句柄

在某些平台上,包括 Android,sdl3 即使没有创建渲染器也会尝试自己创建 OpenGL 上下文。这可能导致初始化 Vulkan 或 GLES 时出现如 VK_ERROR_NATIVE_WINDOW_IN_USE_KHR 的错误。在创建窗口之前添加以下代码以修复错误

sdl3::hint::set("SDL_VIDEO_EXTERNAL_CONTEXT", "1")

当事情出错时

Rust 和 sdl3-rs 都还在积极开发中,你可能会在使用时遇到一些问题。在恐慌之前,请确保你正在使用 Rust 和 Cargo 的最新版本,确保你已经将 sdl3-rs 更新到最新版本,并运行 cargo clean。如果这失败了,请通过问题跟踪器告诉我们。

测试

你可以通过以下方式运行测试套件

cargo test --features=test-mode

test-mode 特性允许你在主线程之外的其他线程中运行 Sdl::new(),这对于运行集成测试(test/*.rs)是必要的。

贡献

我们正在寻找能够帮助构建、测试和完成 Rust 中的 SDL3 支持的人。你可以帮忙!

如果你看到任何错误、遗漏或不理想的地方,请随时提交一个包含你改进的 PR。

如果你想讨论想法或提问,请加入 Discord 上的 #rust 频道 Discord

一旦 SDL3 稳定下来

  • 新功能必须有适当的文档,无论是通过示例还是通过内联文档(通过 cargo doc)。文档必须针对最终用户以及你的下一个贡献者。
  • 破坏性变更必须有适当的论证。虽然此软件包的 1.0 版本之前的状况允许我们相对不稳定,但 无用的破坏性变更将被拒绝
  • 通过 Pull Request 添加的次要更改、破坏性变更和新功能必须添加到 changelog 文件中。现在 强制 记录你的更改到变更日志中。一个简短的描述,以及链接到 GitHub 中的你的提交/PR 即可。内部、文档或元更改(travis 构建更改、README 指令更新等)不需要添加到变更日志中。

依赖

~15MB
~304K SLoC