#bevy #buffer #gamedev #double-buffering

bevy_double_res

为bevy资源提供简单的双缓冲实现

1个不稳定版本

0.1.0 2022年9月3日

#1210 in 游戏开发

MIT许可

25KB
113

bevy_double_res

普通bevy引擎资源简单双缓冲实现

使用方法

首先,创建您的缓冲区

fn main() {
    use bevy_double_res::prelude::*;
    
    let mut tuple = (10, 20).into_double_buf();
    
    //...
}

或者

fn main() {
    use bevy_double_res::prelude::*;
    
    let mut tuple = DoubleBuffer::new((10, 20));
    
    //...
}

其次,修改项目

fn main() {
    //...

    tuple.apply(|current, next| {
        next.0 = current.1;
        next.1 = current.0;
    });
    tuple.swap();
    
    //...
}

或者

fn main() {
    //...
    
    let (current, next) = tuple.split_ordered();
    next.0 = current.1;
    next.1 = current.0;
    tuple.swap();
    
    //...
}

不要忘记交换!

最后,显示缓冲区内容

fn main() {
    use bevy_double_res::prelude::*;
    
    let mut tuple = (10, 20).into_double_buf();
    
    tuple.apply(|current, next| {
        next.0 = current.1;
        next.1 = current.0;
    });
    tuple.swap();
    
    println!("{:?}", tuple.current()); // outputs: (20, 10)
}

在系统中使用

创建资源的方式相同

fn setup(mut commands: Commands) {
    let tuple = (10, 20).into_double_buf();

    commands.insert_resource(tuple);
}

在系统中访问资源

  • 只读?则使用 DoubleRes(与 Res 相匹配)
  • 可变?则使用 DoubleResMut(与 ResMut 相匹配)
fn circular_dependent_system(mut tuple: DoubleResMut<(i32, i32)>) {
    tuple.apply(|current, next| {
        next.0 = current.1;
        next.1 = current.0;
    });
    tuple.swap();
}

请参阅使用示例

依赖项

~7–14MB
~172K SLoC