10个版本 (6个重大更新)
0.7.1 | 2024年7月5日 |
---|---|
0.7.0 | 2024年7月4日 |
0.6.0 | 2024年4月24日 |
0.5.2 | 2024年2月21日 |
0.1.0 | 2023年4月14日 |
#48 in 游戏开发
678 每月下载量
用于 haalka
67KB
1K SLoC
Bevy Rand
什么是Bevy Rand?
Bevy Rand是一个插件,以ECS友好的方式提供rand生态系统PRNG的集成。它提供了一组包装组件和资源类型,允许安全访问PRNG以生成随机数,并提供反射、序列化等功能。使用这些类型,可以以与多线程兼容的方式使用这些集成的PRNG,同时避免诸如不稳定的查询迭代顺序等陷阱。
使用Bevy Rand
现在有一个教程,如果您想了解更多关于如何使用
bevy_rand
的详细信息,请访问这里。
Bevy Rand的使用可以从非常简单到相当复杂,这完全取决于是否关心确定性输出。首先,将bevy_rand
和rand_core
或rand
添加到您的Cargo.toml
中,以引入您想要使用的组件和PRNG,以及使用RNG所需的各种特性。要使用bevy_rand
选择给定的算法类型,启用代表您想要使用的算法的rand_*
crate特性。这将使您可以通过预导入获取PRNG结构。或者,您可以直接使用bevy_prng
来获取具有相同特性标志的新类型结构。但是,直接使用如rand_chacha
这样的算法crate将不起作用,因为这些没有实现支持bevy反射的必要特性。
所有支持的PRNG和兼容的结构都由bevy_prng
crate提供。只需在bevy_rand/
bevy_prng
中激活相关的功能,即可引入您想要使用的PRNG算法,然后按如下方式导入它们:
bevy_rand
功能激活
rand_core = "0.6"
bevy_rand = { version = "0.7", features = ["rand_chacha", "wyrand"] }
bevy_prng
功能激活
rand_core = "0.6"
bevy_rand = "0.7"
bevy_prng = { version = "0.7", features = ["rand_chacha", "wyrand"] }
选择随机数生成算法的总结是:在几乎所有情况下选择 wyrand
,因为它比其他算法更快、更便携。对于需要额外确保熵质量(如安全性等)的情况,请使用 rand_chacha
。更多信息,请访问此处。
为 Bevy Rand 注册 PRNG
在使用 GlobalEntropy
或 EntropyComponent
之前,必须通过插件进行注册。
use bevy::prelude::*;
use bevy_prng::WyRand;
use bevy_rand::prelude::EntropyPlugin;
use rand_core::RngCore;
fn main() {
App::new()
.add_plugins(EntropyPlugin::<WyRand>::default())
.run();
}
基本用法
在最简单的情况下,直接使用 GlobalEntropy
进行所有随机数生成,尽管这限制了使用 GlobalEntropy
的系统并行化的程度。所有访问 GlobalEntropy
的系统都将相互串行运行。
use bevy::prelude::ResMut;
use bevy_prng::WyRand;
use bevy_rand::prelude::GlobalEntropy;
use rand_core::RngCore;
fn print_random_value(mut rng: ResMut<GlobalEntropy<WyRand>>) {
println!("Random value: {}", rng.next_u32());
}
分叉 RNG
要从全局源为 EntropyComponent
基准,最好使用分叉而不是直接生成种子值。由于 GlobalEntropy
只能作为一个实例存在,因此在正常分叉时,它始终作为 EntropyComponent
实例进行分叉。
use bevy::prelude::*;
use bevy_prng::WyRand;
use bevy_rand::prelude::{GlobalEntropy, ForkableRng};
#[derive(Component)]
struct Source;
fn setup_source(mut commands: Commands, mut global: ResMut<GlobalEntropy<WyRand>>) {
commands
.spawn((
Source,
global.fork_rng(),
));
}
EntropyComponent
还可以从其他 EntropyComponent
中进行基准/分叉。
use bevy::prelude::*;
use bevy_prng::WyRand;
use bevy_rand::prelude::{EntropyComponent, ForkableRng};
#[derive(Component)]
struct Npc;
#[derive(Component)]
struct Source;
fn setup_npc_from_source(
mut commands: Commands,
mut q_source: Query<&mut EntropyComponent<WyRand>, (With<Source>, Without<Npc>)>,
) {
let mut source = q_source.single_mut();
for _ in 0..2 {
commands
.spawn((
Npc,
source.fork_rng()
));
}
}
功能
thread_local_entropy
- 启用ThreadLocalEntropy
,覆盖SeedableRng::from_entropy
实现,以使用线程本地熵源进行更快的 PRNG 初始化。默认启用。serialize
- 启用Serialize
和Deserialize
derive。默认启用。rand_chacha
- 这启用了导出新的ChaCha*Rng
结构体,供需要/需要使用 CSPRNG 级别源的人使用。rand_pcg
- 这启用了从rand_pcg
导出新的Pcg*
结构体。rand_xoshiro
- 这启用了从rand_xoshiro
导出新的Xoshiro*
结构体。它还重新导出Seed512
,以便在不显式引入rand_xoshiro
的情况下设置Xoshiro512StarStar
等等。wyrand
- 这启用了从wyrand
导出新的WyRand
,与在fastrand/
turborand
中使用的相同算法。
支持版本 & MSRV
bevy_rand
使用与 bevy
相同的 MSRV。
bevy |
bevy_rand |
---|---|
v0.14 | v0.7 |
v0.13 | v0.5 - v0.6 |
v0.12 | v0.4 |
v0.11 | v0.2 - v0.3 |
v0.10 | v0.1 |
bevy_rand
兼容的 rand_core/
rand
版本如下
bevy_rand |
rand_core |
rand |
---|---|---|
v0.1 -> v0.7 | v0.6 | v0.8 |
迁移
有关在不同版本之间迁移的说明,请参阅此处。
许可
根据您的选择,许可如下
- Apache License,版本 2.0(LICENSE-APACHE 或 http://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
依赖关系
~23MB
~415K SLoC