我正在开发一个业余爱好游戏引擎,我有一个结构Mesh和一个用Instance查看它的视图
struct Mesh {
// Vertex info, etc
}
struct Instance<'a> {
mesh: &'a Mesh,
transform: Mat4,
}在我看来,这正是生命周期规则的目的;我声明Instance的生命周期必须比它所引用的Mesh的生命周期短。
当我尝试在main函数中使用它时:
fn main() {
let mesh = Mesh::new();
// Add vertices, etc
// Scene has a Vec<Box<dyn Drawable>>, which Instance implements.
let mut scene = Scene::new(glam::Mat4::zero());
scene.push(Box::new(Instance::new(&mesh, glam::Mat4::zero())));
render_scene(scene)
}我从借入检查器中得到以下错误:
error[E0597]: `mesh` does not live long enough
--> bin/rendertest.rs:9:39
|
9 | scene.push(Box::new(Instance::new(&mesh, glam::Mat4::zero())));
| -----------------------^^^^^----------------------
| | |
| | borrowed value does not live long enough
| cast requires that `mesh` is borrowed for `'static`
...
12 | }
| - `mesh` dropped here while still borrowed它谈论的演员阵容是什么?为什么它需要网格是'static的?当main退出时,网格似乎应该会在render_scene的回归之后存活下来。
发布于 2020-06-30 13:37:22
这里的关键问题是Box<dyn T>等同于Box<dyn T + 'static>。但这只是默认的生存期--您可以通过编写Box<dyn T + 'a>来覆盖它。
您需要更改的唯一一件事是为Scene提供生命周期,并将其传递给包含的Boxes。
struct Scene<'a> {
entries: Vec<Box<dyn Drawable + 'a>>,
}
impl<'a> Scene<'a> {
pub fn new() -> Scene<'a> {
Scene { entries: vec![] }
}
}在playground上提供了完整的示例
发布于 2020-06-30 17:24:38
最后,我发现使用std::rc::Rc制作Instance是最简单的
struct Instance {
mesh: Rc<Mesh>,
transform: Mat4
}在语义上,这并不真正符合预期:网格在游戏运行结束之前不需要删除,所以我不需要计算对它们的引用。但它使我不必向Scene对象和任何其他具有Scene的对象添加大量显式生命周期。
https://stackoverflow.com/questions/62650594
复制相似问题