2个不稳定版本
0.2.0 | 2024年8月10日 |
---|---|
0.1.0 | 2024年8月9日 |
6 in #double
188 每月下载量
7KB
65 行
bufferbuffer
这是Robert Nystrom的《游戏编程模式》中Double Buffer设计模式的实现。
在模拟中,你经常需要做大量的处理来准备下一个“帧”,但如果你在遍历当前状态数据的同时修改它,事情可能会出错。Double Buffer设计模式通过保留两个模拟状态的副本(或任何变量)来解决此问题:不可变的“当前”(或之前)状态,以及正在准备的“下一”(或未来)状态。当模拟的一轮完成时,你只需切换缓冲区即可。
与crates.io上的其他实现不同,这个实现将两个缓冲区都包装在std::cell::RefCell
中,这样就可以在另一个缓冲区作为不可变借用时同时借一个缓冲区作为可变借用——一个典型的用例是遍历世界中的对象(当前状态)并将它们的更新版本写入下一个状态。
用法
对于简单的变量
let mut my_double_buf: DoubleBuffer<i32> = DoubleBuffer::new(0,0);
*my_double_buf.next() += 10;
my_double_buf.switch();
assert_eq!(*my_double_buf.current(), 10);
对于向量
let mut my_double_buf: DoubleBuffer<Vec<i32>> = DoubleBuffer::new( vec!(2,4,6), Vec::new());
for number in my_double_buf.current().iter() {
my_double_buf.next().push(*number + 1);
}
my_double_buf.switch();
assert_eq!(*my_double_buf.current(), vec!(3,5,7));