3 个版本 (破坏性)

0.3.0 2024年7月14日
0.2.0 2024年7月14日
0.1.0 2024年7月13日

#318 in 游戏开发

Download history 266/week @ 2024-07-10 28/week @ 2024-07-17 3/week @ 2024-07-31

每月52 次下载

自定义许可

53KB
945

bevy_falling_sand 是一个插件,用于为您的 Bevy 项目添加落沙物理。

Bevy 版本

bevy_falling_sand bevy
0.3.x 0.14.x
0.1.x 0.13.x

示例

如果您克隆此仓库,将有一个示例可用,它提供了一个类似“沙盒”的完整GUI界面。我建议使用 --release 标志运行示例以最大化性能

cargo run --example sandbox --release

如何使用

创建粒子很简单,只需在具有 Transform 组件的实体上插入一个 ParticleType 变体即可,它将被添加到模拟中

commands.spawn((
    ParticleType::Water,
    SpatialBundle::from_transform(Transform::from_xyz(0., 0., 0.)),
    ));

当前限制

ChunkMap 大小

出于优化的原因,粒子底层映射机制使用一系列块,每个块在没有检测到给定帧中的移动时,将对其自身和包含的粒子引起“休眠”状态。因此,地图的总大小有限(默认为 1024x1024,从变换 (-512, 512)(512, -512))。任何处理在此区域之外的粒子将导致恐慌。

这将在未来的版本中得到解决,该版本将修改 ChunkMap 以“跟随”具有任意指定组件的实体(例如,主相机),在移动时加载和卸载块。这将模拟一个“无限”空间,其中粒子可以驻留。

单线程模拟

目前,粒子模拟是单线程的。计划在未来的版本中实现多线程模拟。

如果您想在此期间调整 CPU 线程分配以进行性能实验,您可以尝试调整 Bevy 提供的默认任务池线程分配策略。我根据 CPU 制造商/架构找到了不同的性能结果(抱歉,没有提供基准测试)

use bevy::{
    core::TaskPoolThreadAssignmentPolicy, prelude::*, tasks::available_parallelism,
};

fn main() {
    let mut app = App::new();
    app.add_plugins(DefaultPlugins
        .set(TaskPoolPlugin {
            task_pool_options: TaskPoolOptions {
                compute: TaskPoolThreadAssignmentPolicy {
                    min_threads: available_parallelism(),
                    max_threads: std::usize::MAX,
                    percent: 1.0,
                },
                ..default()
            },
        }));
}

可视化块行为

如果您想可视化块的行为,请插入 DebugParticles 资源

app.init_resource::<DebugParticles>()

Debug Mode Demo

演示

Steam

Steam Demo

Water Demo

依赖项

~22–57MB
~1M SLoC