#rand #bevy #rng #game-engine #generate #thread-local

bevy_rand

为Bevy游戏引擎集成rand的ECS优化RNG插件

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 游戏开发

Download history 110/week @ 2024-04-27 70/week @ 2024-05-04 76/week @ 2024-05-11 96/week @ 2024-05-18 64/week @ 2024-05-25 96/week @ 2024-06-01 78/week @ 2024-06-08 110/week @ 2024-06-15 111/week @ 2024-06-22 362/week @ 2024-06-29 279/week @ 2024-07-06 90/week @ 2024-07-13 83/week @ 2024-07-20 282/week @ 2024-07-27 151/week @ 2024-08-03 156/week @ 2024-08-10

678 每月下载量
用于 haalka

MIT/Apache

67KB
1K SLoC

Bevy Rand

Crates.io CI License Documentation

什么是Bevy Rand?

Bevy Rand是一个插件,以ECS友好的方式提供rand生态系统PRNG的集成。它提供了一组包装组件和资源类型,允许安全访问PRNG以生成随机数,并提供反射、序列化等功能。使用这些类型,可以以与多线程兼容的方式使用这些集成的PRNG,同时避免诸如不稳定的查询迭代顺序等陷阱。

使用Bevy Rand

现在有一个教程,如果您想了解更多关于如何使用bevy_rand的详细信息,请访问这里

Bevy Rand的使用可以从非常简单到相当复杂,这完全取决于是否关心确定性输出。首先,将bevy_randrand_corerand添加到您的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

在使用 GlobalEntropyEntropyComponent 之前,必须通过插件进行注册。

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 - 启用 SerializeDeserialize 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

迁移

有关在不同版本之间迁移的说明,请参阅此处

许可

根据您的选择,许可如下

依赖关系

~23MB
~415K SLoC