我是 Rust 的绝对初学者,所以如果我的问题没有用正确的术语表达,我很抱歉,如果需要,我很乐意提供更多说明。
我正在使用
sdl
和 rlua
编写程序。该程序将加载并运行一个lua脚本,并提供该脚本可以使用的函数。这些函数将允许绘制到 SDL 渲染器。
为了做到这一点,我向 lua 注册的 rust 函数需要访问 SDL 渲染器(或
canvas
,因为它是由这个 SDL 包装器调用的)。
我发现在 lua 回调中访问
canvas
的唯一方法是将其包装在引用计数互斥体中。这允许我维护对它的多个可变引用,因此我可以继续在封闭范围的其余部分中访问它。这是我所拥有的精简版:
extern crate rlua;
extern crate sdl2;
use std::rc::Rc;
use std::sync::Mutex;
fn main() {
let lua = rlua::Lua::new();
let sdl = sdl2::init().unwrap();
let video = sdl.video().unwrap();
let window = video.window("", 640, 320).resizable().build().unwrap();
let canvas = Rc::new(Mutex::new(window.into_canvas().build().unwrap()));
let draw_rect_canvas = canvas.clone();
let draw_rect = lua
.create_function_mut(move |_, (x, y, w, h): (i32, i32, u32, u32)| {
draw_rect_canvas
.lock()
.unwrap()
.draw_rect(sdl2::rect::Rect::new(x, y, w, h))
.unwrap();
Ok(())
})
.unwrap();
lua.globals().set("draw_rect", draw_rect).unwrap();
canvas
.lock()
.unwrap()
.set_draw_color(sdl2::pixels::Color::RGB(0, 0, 0));
}
这可以编译,并执行我需要的操作。但是,我想知道引用计数或互斥体是否真的有必要,因为我认为它们会引入少量的运行时开销。
还有其他方法可以告诉编译器以下信息吗?
canvas
lua 函数
draw_rect
canvas
引用计数和内部可变性看起来是正确的调用,但您绝对应该将
Mutex
替换为 RefCell
,以获得更好的性能和可调试性。
如果您只有一个需要访问画布的函数,并且不需要在主函数中访问它,则可以直接将其
move
放入闭包中,而不需要Rc<RefCell>
,但看起来这不是案例。