我已经实现了广泛的阶段碰撞检测算法,该算法返回索引的嵌套向量 (
Vec<Vec<usize>>
)。我可以保证每个索引在嵌套向量中最多出现一次。我想使用这些索引来索引物体向量并并行执行窄相碰撞检测。
在一个最小的示例中,我们将为每个索引向量获取对元素的 &mut 引用,以形成唯一 &mut 引用的向量,并对此向量执行窄相位检测。
let bodies: Vec<u8> = vec![0,1,2,3,4,5,6];
let pass: Vec<Vec<usize>> = vec![vec![0,4],vec![2,3,5]];
pass.par_iter()
.map(|indices| {
let local_bodies: Vec<&mut u8> =
indices.iter().map(|i| &mut bodies[i]).collect();
narrow_phase(&local_bodies)
});
但是我遇到的错误有两个:
&mut
引用无法逃逸到内部闭包之外。Fn
闭包中捕获的变量在 Rust 中进行此类随机访问和安全变异的首选方法是什么?我想避免使用
Arc
和 Mutex
的开销。此外,我知道编译器本身无法通过随机访问来保证安全,而是需要一些额外的功能(如Arc
和Mutex
)。
许多首选答案是使用内置
chunks_mut
和/或 split_at_mut
但是我认为它们在这里不适用,因为索引不是连续的。
我发现另一个question似乎有完全相同的问题,但是解决方案使用
std::cell::Cell
,它没有实现Sync
特征(link)。