96个版本
使用旧的Rust 2015
0.37.0 | 2024年6月13日 |
---|---|
0.36.0 | 2023年11月22日 |
0.35.2 | 2022年2月6日 |
0.35.1 | 2021年10月25日 |
0.0.6 | 2014年11月29日 |
#7 in 渲染
33,733 每月下载量
在 310 个Crates(240直接) 中使用
16MB
342K SLoC
Rust-SDL2
SDL2的Rust绑定
0.37.0版本更改日志
概述
Rust-SDL2是一个从Rust调用新SDL2.0库的库。通过Rust代码包装低级别的C组件,使其更符合习惯用法,并抽象出不适当的手动内存管理。
Rust-SDL2使用MIT许可证,但SDL2本身在zlib许可证下。
可用的Rust功能
gfx
用于链接到SDL2_gfx并访问gfx功能image
用于链接到SDL2_image并访问图像读写功能mixer
用于链接到SDL2_mixer并访问声音混合功能ttf
用于链接到SDL2_ttf并访问各种字体功能unsafe-textures
用于不在Texture
结构中设置生命周期。纹理仅在程序退出时释放,或者可以通过unsafe
手动释放。use-bindgen
用于自定义绑定,而不是使用从Linux环境创建的预生成的sdl_bindings
。它生成您自己的自定义SDL2绑定,适用于您的发行版。对于特定窗口相关场景非常有用。use-vcpkg
用于从vcpkg获取SDL2而不是在系统中查找。use-pkgconfig
使用pkg-config检测您的库在系统中的位置。在Unix系统上,对于静态链接非常有用。static-link
将SDL2静态链接,而不是动态链接。use_mac_framework
在macOS上使用Framework中的SDL2bundled
,这将拉取SDL仓库并从源代码编译。更多信息见下文。
文档
要求
Rust
我们目前针对Rust的最新稳定版。
SDL2.0开发库
建议使用SDL2 >= 2.0.26的绑定;如果低于2.0.26,您可能会遇到链接时间错误,因为这里使用了但未在SDL2中定义的一些函数。如果您遇到此问题是因为您正在使用LTS机器(例如,Ubuntu),我们强烈建议您使用“捆绑”功能,该功能将为您的项目编译最新的稳定版SDL2。
"捆绑"功能
从0.31版开始,此crate支持一个名为“捆绑”的功能,可以从源代码编译SDL2并自动链接。虽然这应该适用于任何架构,但您必须拥有C编译器(例如gcc
、clang
或MS自己的编译器)才能正确使用此功能。
默认情况下,macOS和Linux仅从系统目录(如/usr/lib
)加载库。如果您希望将新构建的libSDL2.so/libSDL2.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");
**这仅适用于SDL2,不适用于SDL2_image、SDL2_mixer、SDL2_ttf、SDL2_gfx**
Linux
通过您喜欢的包管理工具安装这些,或通过http://www.libsdl.org/
Ubuntu示例
sudo apt-get install libsdl2-dev
Fedora示例
sudo dnf install SDL2-devel
Arch示例
(Arch没有单独的常规和开发包,所有东西都在一起。)
sudo pacman -S sdl2
您可能还需要C编译器(gcc
)。
Linux中的静态链接
您可以选择使用static-link
功能将SDL2静态链接,而不是动态链接。在Linux上,您还需要执行以下操作之一
- 使用
bundled
功能 - 使用功能
use-pkgconfig
,以便rustc知道在哪里查找您的SDL2库及其静态链接的依赖项。这是必需的,因为没有内置的查找用于从系统静态链接SDL2所需资源的方法 - 使用vcpkg安装开发库。有关使用vcpkg在Linux和其他操作系统上生成静态二进制的说明,请参阅此处
macOS
Homebrew
在macOS上,建议通过homebrew安装这些。
brew install sdl2
在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
获取sdl2。
sudo port install libsdl2
如果尚未存在,请将以下内容添加到您的 ~/.bash_profile
中。
export LIBRARY_PATH="$LIBRARY_PATH:/opt/local/lib/"
如果您在使用 Homebrew 或 MacPorts 时遇到问题,请参阅这里。
如果您正在使用 SDL2 框架
您可以从以下网址下载和安装 SDL2 Mac OS X 框架:https://www.libsdl.org/download-2.0.php
为了使 sdl2
包链接到 SDL2 框架,您需要启用 use_mac_framework
功能。要使用此功能构建和测试 sdl2
包,请使用以下命令:
cargo test --features use_mac_framework
要使用此功能依赖 sdl2
包,请将以下内容放入您的项目 Cargo.toml
文件中
[dependencies.sdl2]
features = ["use_mac_framework"]
version = ... # Whichever version you are using
或者,您也可以通过在 Cargo.toml
文件中放入以下内容来在您的包中重新导出此功能
[features]
default = []
use_sdl2_mac_framework = ["sdl2/use_mac_framework"]
使用 vcpkg 在 macOS 上进行静态链接
有关使用 vcpkg 在 macOS 和其他操作系统上生成静态二进制文件的说明,请参阅这里。
Windows (MSVC)
-
从 http://www.libsdl.org/ 下载 MSVC 开发库(SDL2-devel-2.0.x-VC.zip)。
-
将 SDL2-devel-2.0.x-VC.zip 解压到您选择的文件夹中(之后您可以删除它)。
-
将以下路径中的所有 lib 文件复制到
SDL2-devel-2.0.x-VC\SDL2-2.0.x\lib\x64\
到(对于 Rust 1.6 及以上版本)
C:\Program Files\Rust\lib\rustlib\x86_64-pc-windows-msvc\lib
或到(对于 Rust 版本 1.5 及以下)
C:\Program Files\Rust\bin\rustlib\x86_64-pc-windows-msvc\lib
或到您选择的库文件夹中,并确保您有一个名为
LIB = C:\your\rust\library\folder
对于 Rustup 用户,此文件夹位于
C:\Users\{Your Username}\.rustup\toolchains\{current toolchain}\lib\rustlib\{current toolchain}\lib
其中当前工具链可能是 stable-x86_64-pc-windows-msvc
。
-
将 SDL2.dll 从
SDL2-devel-2.0.x-VC\SDL2-2.0.x\lib\x64\
复制到您的 cargo 项目中,紧挨着 Cargo.toml。
-
当您发布游戏时,请确保将 SDL2.dll 复制到与编译后的 exe 文件相同的目录中,否则游戏无法启动。
使用 MSVC 进行静态链接
http://libsdl.org/ 提供的 MSVC 开发库不包含静态库。这意味着如果您想使用 windows-msvc 工具链的 static-link
功能,您必须执行以下操作之一:
- 自己构建 SDL2 静态库并将其复制到工具链的
lib
目录中;或者 - 同时启用
bundled
功能,这将为您构建静态库;或者 - 使用以下说明中描述的 vcpkg 中的静态 SDL2 库。
Windows (MinGW)
-
从 http://www.libsdl.org/ 下载 mingw 开发库(SDL2-devel-2.0.x-mingw.tar.gz)。
-
解压到您选择的文件夹中(之后您可以删除它)。
-
将以下路径中的所有 lib 文件复制到
SDL2-devel-2.0.x-mingw\SDL2-2.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\{Your Username}\.rustup\toolchains\{current toolchain}\lib\rustlib\{current toolchain}\lib
其中当前工具链可能是 stable-x86_64-pc-windows-gnu
。
-
将 SDL2.dll 从
SDL2-devel-2.0.x-mingw\SDL2-2.0.x\x86_64-w64-mingw32\bin
复制到您的 cargo 项目中,紧挨着 Cargo.toml。
-
当您发布游戏时,请确保将 SDL2.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
软件包。
您可以在以下路径找到上述库:对于 x86_64,为 mingw64/x86_64-w64-mingw32/lib/
;对于 i686,为 mingw32/i686-w64-mingw32/lib/
。将它们复制到您的工具链的 lib
目录(与您复制 SDL .a 文件相同的目录)。
带有构建脚本的 Windows
- 从 http://www.libsdl.org/(SDL2-devel-2.0.x-mingw.tar.gz & SDL2-devel-2.0.x-VC.zip)下载 mingw 和 msvc 开发库。
- 解压缩到您选择的文件夹(之后您可以删除它)。
- 在 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
- 将源存档中的 lib 和 dll 文件按如下方式复制到步骤 3 中创建的目录中
SDL2-devel-2.0.x-mingw.tar.gz\SDL2-2.0.x\i686-w64-mingw32\bin -> gnu-mingw\dll\32
SDL2-devel-2.0.x-mingw.tar.gz\SDL2-2.0.x\x86_64-w64-mingw32\bin -> gnu-mingw\dll\64
SDL2-devel-2.0.x-mingw.tar.gz\SDL2-2.0.x\i686-w64-mingw32\lib -> gnu-mingw\lib\32
SDL2-devel-2.0.x-mingw.tar.gz\SDL2-2.0.x\x86_64-w64-mingw32\lib -> gnu-mingw\lib\64
SDL2-devel-2.0.8-VC.zip\SDL2-2.0.x\lib\x86\*.dll -> msvc\dll\32
SDL2-devel-2.0.8-VC.zip\SDL2-2.0.x\lib\x64\*.dll -> msvc\dll\64
SDL2-devel-2.0.8-VC.zip\SDL2-2.0.x\lib\x86\*.lib -> msvc\lib\32
SDL2-devel-2.0.8-VC.zip\SDL2-2.0.x\lib\x64\*.lib -> msvc\lib\64
- 如果您还没有构建脚本,请创建一个构建脚本,并将其放在 Cargo.toml 下的
[package]
build = "build.rs"
- 在 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");
}
}
}
}
}
- 在构建时,构建脚本将把所需的 DLLs 复制到与 Cargo.toml 相同的目录,但是您可能不希望将这些文件提交到任何 Git 仓库,因此请将以下行添加到 .gitignore 文件中
/*.dll
- 当您发布游戏时,请确保将相应的 SDL2.dll 复制到与编译后的 exe 文件相同的目录,否则游戏将无法启动。
现在,您的项目应该可以在任何 Windows 计算机上构建和运行!
带有 vcpkg 的 Windows (MSVC)
- 安装 MS build tools 和 vcpkg
- 安装所需的 SDL2 库:
vcpkg.exe install sdl2:ttf:x64-windows sdl2:x64-windows
- 打开 x64 native tools 命令提示符(VS 2019 的 x64 Native Tools Command Prompt)
- 设置环境变量
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
cargobuild
带有 vcpkg 的 Windows、Linux 和 macOS
获取开发库的另一种方法是使用 vcpkg。为了设置一个项目,以在 Windows (MSVC)、Linux 或 macOS 上构建可静态编译的二进制文件,可按如下方式构建
cargo install cargo-vcpkg
cargo vcpkg build
cargo build
将以下内容添加到您的 Cargo.toml
[dependencies.sdl2]
version = "0.37"
default-features = false
features = ["ttf","image","gfx","mixer","static-link","use-vcpkg"]
[package.metadata.vcpkg]
dependencies = ["sdl2", "sdl2-image[libjpeg-turbo,tiff,libwebp]", "sdl2-ttf", "sdl2-gfx", "sdl2-mixer"]
git = "https://github.com/microsoft/vcpkg"
rev = "2024.05.24" # release 2024.05.24 # to check for a new one, check https://github.com/microsoft/vcpkg/releases
[package.metadata.vcpkg.target]
x86_64-pc-windows-msvc = { triplet = "x64-windows-static-md" }
有关 cargo vcpkg
工具的更多信息,请参阅 此处。
安装
如果您使用 cargo 管理项目,您可以通过 Crates.io 下载
[dependencies]
sdl2 = "0.37"
或者,从 GitHub 拉取以获取最新版本的 master
[dependencies.sdl2]
git = "https://github.com/rust-sdl2/rust-sdl2"
否则,克隆此存储库并运行 cargo
cargo build
您可以通过添加以下内容来启用功能,如 ttf、image、gfx 和 mixer
[dependencies.sdl2]
version = "0.37"
default-features = false
features = ["ttf","image","gfx","mixer"]
这些功能需要它们各自的库,它们的位置如下:(安装过程与 SDL2 相同)
关于 sdl2_net 呢?
到目前为止,与诸如 serde
和 bincode
等其他 crate 相比,sdl2_net 没有意义。我们强烈建议使用这些库来开发任何与 UDP 或 TCP 相关的应用(同时使用 futures 或标准库中的 TCP/UDP)。
如果您仍然想要 sdl2_net 的实现,您可以通过拉取请求(Pull Request)在此存储库中添加它作为功能。此绑定的一个较旧版本可以在 此处 找到
示例
我们包含了一些简单的示例项目
cargo run --example demo
您可以在 examples/
文件夹中查看完整列表。一些示例需要某些功能,您可以通过以下方式启用它们
cargo run --example gfx-demo --features "gfx"
将“gfx”替换为您想要示例所需的功能。
关于unsafe_textures
功能
在sdl2::render
模块中,Texture
默认具有生命周期,以防止其超出其父TextureCreator
的生命周期。这些生命周期有时在Rust中很难处理,因此您可以选择启用unsafe_textures
功能。
这将移除Texture
的生命周期,但需要手动管理内存。如果您想要手动销毁使用的Texture
,可以调用您的Texture
的destroy
方法,但请注意,如果父对象(Canvas
或TextureCreator
)中的任何一个都不存在,则不应调用此方法。如果您不调用此方法,内存将在最后一个Canvas
或最后一个TextureCreator
被释放时自动释放。
此功能没有在线文档,但是您可以在项目中通过在Cargo.toml中启用功能,运行cargo doc
并在浏览器中访问target/doc/sdl2/index.html
来自动构建它。
使用bindgen生成sdl2-sys
为该crate生成的sdl2-sys非常通用,可以在许多平台上使用,且限制很少。然而,您可能会在使用SDL2的平台特定功能时遇到麻烦,例如窗口管理器类别。
“use-bindgen”功能允许您通过根据目标生成适当的绑定来避免这种限制。它将使用pkg-config
输出的头文件(如果您启用了“use-pkg-config”功能)来生成绑定。如果没有pkg-config或禁用了此功能,它将尝试从该crate的SDL-2.0.8/include
中获取头文件。
如果您有自己的头文件想要使用(使用beta版本、旧版本等),可以设置环境变量“SDL2_INCLUDE_PATH”,这些头文件将由bindgen使用。
使用sdl2-sys提供SDL2头文件/库
如果您正在为需要SDL2的库创建一个*-sys
crate,您可以使用sdl2-sys
来提供编译后的库和SDL2的头文件。
遵循以下步骤获取头文件目录。在*-sys
crate的Cargo.toml
中添加sdl2-sys
作为依赖项(非构建依赖项)。Cargo将为您的构建脚本提供一个环境变量DEP_SDL2_INCLUDE
,该变量包含SDL2的头文件目录。如果有多个目录,它们将使用:
作为分隔符组合。将这些目录传递给构建您的C/C++的构建系统。
所有C、C++和Rust代码将使用sdl2-sys
提供的单个SDL2副本。
更多讨论请参阅相应的问题
OpenGL
使用OpenGL有两种方式
- 作为sdl2::render的后端,sdl2为您处理所有操作。它是Linux设备的默认选项。
- 手动使用sdl2作为窗口的“外壳”(类似于
glutin
和winit
框架),同时仍然使用sdl2的摇杆、事件、音频、文本输入等能力。
如果您想使用OpenGL,还需要gl-rs包。如果您使用cargo,只需将这些行添加到您的Cargo.toml文件中
[dependencies.gl]
git = "https://github.com/bjz/gl-rs"
使用sdl2与OpenGL结合有两种选择
- 使用Canvas与OpenGL结合,并使用sdl2::render
- 直接在窗口“外壳”上使用OpenGL,并使用手动OpenGL调用进行渲染
使用sdl2::render
首先,从SDL中找到OpenGL驱动程序
fn find_sdl_gl_driver() -> Option<u32> {
for (index, item) in sdl2::render::drivers().enumerate() {
if item.name == "opengl" {
return Some(index as u32);
}
}
None
}
fn main() {
let sdl_context = sdl2::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-rs框架使用OpenGL调用,您可以在这里停止。SDL2将自动使用OpenGL后端
如果您打算将您自己的调用与sdl2调用交织在一起,您需要首先使用您的画布的上下文
// 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();
但请注意,sdl2有自己的内部状态,您应该避免对其进行操作。避免在SDL2调用中间使用手动OpenGL,或者确保恢复之前的状态。
手动使用OpenGL调用
extern crate sdl2;
extern crate gl;
use sdl2::event::Event;
use sdl2::keyboard::Keycode;
use sdl2::video::GLProfile;
fn main() {
let sdl_context = sdl2::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));
}
}
如上所述,此方法在您不关心sdl2的渲染能力,但关心sdl2的音频、控制器和其他sdl2提供的酷炫功能时很有用。
您不必担心与sdl2或您不喜欢的版本交织在一起的状态:SDL2永远不会在render
模块之外调用任何OpenGL函数。
Vulkan
要使用Vulkan,您需要一个Rust的Vulkan库。此示例使用Vulkano库。其他库可能使用不同的原始Vulkan对象句柄数据类型。将SDL2的Vulkan函数与这些库接口化的过程将因库而异。
首先,确保您启用了raw-window-handle
功能。
extern crate sdl2;
extern crate vulkano;
use sdl2::event::Event;
use sdl2::keyboard::Keycode;
use vulkano::instance::{Instance, InstanceCreateInfo, InstanceExtensions};
use vulkano::swapchain::Surface;
use vulkano::VulkanLibrary;
fn main() {
let sdl_context = sdl2::init().unwrap();
let video_subsystem = sdl_context.video().unwrap();
let window = video_subsystem
.window("Window Title - My Vulkano-SDL2 application", 1024, 768)
.vulkan()
.build()
.unwrap();
let instance_extensions =
InstanceExtensions::from_iter(window.vulkan_instance_extensions().unwrap());
let instance = Instance::new(
VulkanLibrary::new().unwrap(),
InstanceCreateInfo {
enabled_extensions: instance_extensions,
..Default::default()
},
)
.unwrap();
// SAFETY: Be sure not to drop the `window` before the `Surface` or vulkan `Swapchain`!
// (SIGSEGV otherwise)
let surface = unsafe { Surface::from_window_ref(instance.clone(), &window) };
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.sdl2]
version = "0.37"
features = ["raw-window-handle"]
还有与wgpu
一起工作的一个示例
cargo run --example raw-window-handle-with-wgpu --features raw-window-handle
macOS上的sdl2与原始窗口句柄
在macOS上,RawWindowHandle.ns_view
字段返回null。使用RawWindowHandle
的库(如wgpu
)应确定ns_view
的合理默认值。如果它们没有这样做,请向相关项目提交问题。
Android上的原始窗口句柄
在某些平台上,包括Android,即使没有创建渲染器,SDL2也会尝试自行创建OpenGL上下文。这可能导致在初始化Vulkan或GLES时出现如VK_ERROR_NATIVE_WINDOW_IN_USE_KHR
之类的错误。在创建窗口之前添加以下代码可以修复错误
sdl2::hint::set("SDL_VIDEO_EXTERNAL_CONTEXT", "1")
出错时
Rust和Rust-SDL2都还在积极开发中,您可能会在使用过程中遇到一些问题。在恐慌之前,请确保您正在使用Rust和Cargo的最新版本,并确保您已将Rust-SDL2更新到最新版本,然后运行cargo clean
。如果这失败,请通过问题跟踪器让我们知道。
贡献
任何Pull Request都受欢迎,无论您的贡献多么微小!然而,贡献也有一些条件
- 新功能必须得到适当的文档,无论是通过示例还是内联文档(通过
cargo doc
)。文档必须面向最终用户以及您的下一任贡献者。 - 重大更改必须要有适当的论证。虽然该软件包在1.0版本之前的版本允许我们有一定的不稳定性,但无用的重大更改将被拒绝。
- 通过拉取请求添加的次要更改、重大更改和新功能必须添加到变更日志文件中。现在在变更日志中记录您的更改是强制性的。一个简短的描述,并附上您在GitHub上的提交/拉取请求的链接即可。内部、文档或元更改(travis构建更改、README说明更新等)无需添加到变更日志中。