似乎 Rust、SDL2 和 Emscripten 的组合是一些人在过去的不同点上所做的工作。
https://github.com/Rust-SDL2/rust-sdl2/issues/884
我有一个让我有点难过的问题。当谈到 Rust 时,我是一个完全的新手,所以我不能忽视这个因素。我借用了一个小程序:
https://puddleofcode.com/story/definitive-guide-to-rust-sdl2-and-emscriptem
...稍加哄骗,我就可以用 编译--target=asmjs-unknown-emscripten
,但是在 Firefox 中运行时,我在控制台中收到一条消息:
线程“主”在“无效的渲染器”时惊慌失措,/home/blah/.cargo/registry/src/github.com-blah-blah/sdl2-0.35.1/src/sdl2/render.rs:990:13
...如果您查看第 990 行render.rs
,它在 中具有明显的恐慌:
/// Sets the color used for drawing operations (Rect, Line and Clear).
#[doc(alias = "SDL_SetRenderDrawColor")]
pub fn set_draw_color<C: Into<pixels::Color>>(&mut self, color: C) {
let (r, g, b, a) = color.into().rgba();
let ret = unsafe { sys::SDL_SetRenderDrawColor(self.raw, r, g, b, a) };
// Should only fail on an invalid renderer
if ret != 0 {
panic!("{}", get_error()) //LINE 990
}
}
...有关如何初始化 SDL 和创建渲染器的详细信息如下所示:
fn main() {
let ctx = sdl2::init().unwrap();
let video_ctx = ctx.video().unwrap();
let window = match video_ctx
.window("updating SDL2 example with rust and asmjs...", 640, 480)
.position_centered()
.opengl() //same results whether .opengl is used or not
.build() {
Ok(window) => window,
Err(err) => panic!("failed to create window: {}", err)
};
let mut renderer = match window
// replace "renderer()" with "into_canvas()" since the "renderer()" method no
// longer seems available in the upgrade from rust-SDL2 v0.29.0 to v0.35.0.
// Compiling with v0.29.0 is apparently incompatible with my recent
// version of emscripten (2.0.31).
//.renderer()
.into_canvas()
.build() {
Ok(renderer) => renderer,
Err(err) => panic!("failed to create renderer: {}", err)
};
//...
...上述运行没有问题。我所知道的是,该程序在编译为 Linux 本机应用程序时按预期工作。而且我还知道我的 Emscripten 安装正在运行,因为我可以创建在浏览器中运行的 C++ 和 SDL2 应用程序。只有在处理图形系统时才会出现恐慌。Rust->asmjs 应用程序中的事件循环用于获取鼠标和键盘事件。最小可重现示例的源文件位于:
https://gist.github.com/gregbuchholz/7d731191fcea95b7450859aeb0f4eb20
...(包括 main.rs、Cargo.toml 等文件)。恐慌发生在 main.rs 的第 68 行:
println!("I'm going to panic on the next statement...");
// with an "Invalid renderer" at sdl2/render.rs:990...
let _ = renderer.set_draw_color(black); //LINE 68
let _ = renderer.clear();
...有人对如何调试这个有想法吗? Println!()
调试通常似乎是这里的游戏名称,但目前各种“渲染器”对象不支持调试 fmt。(添加这可能是下一步)。
感兴趣的版本:
$ rustc --version
rustc 1.55.0 (c8dfcfe04 2021-09-06)
$ emcc --version
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 2.0.31 (4fcbf0239ccca29771f9044c990b0d34fac6e2e7)
Copyright (C) 2014 the Emscripten authors (see AUTHORS.txt)
This is free and open source software under the MIT license.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
那里有各种 rust/emscripten/sdl2 教程,但它们似乎都有点烂了。如果您曾经治愈过“无效渲染器”恐慌,我很想听听更多关于它的信息。
谢谢!