0

似乎 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 教程,但它们似乎都有点烂了。如果您曾经治愈过“无效渲染器”恐慌,我很想听听更多关于它的信息。

谢谢!

4

0 回答 0