94 lines
2.6 KiB
Rust
94 lines
2.6 KiB
Rust
use criterion::{Criterion, criterion_group, criterion_main};
|
|
use pumpkin_data::{BlockStateId, dimension::Dimension};
|
|
use pumpkin_util::{math::vector2::Vector2, world_seed::Seed};
|
|
use pumpkin_world::{
|
|
chunk::{ChunkData, format::anvil::SingleChunkDataSerializer},
|
|
chunk_system::{Chunk, StagedChunkEnum, generate_single_chunk},
|
|
generation::get_world_gen,
|
|
world::WorldPortalExt,
|
|
};
|
|
use std::hint::black_box;
|
|
|
|
struct BlockRegistry;
|
|
|
|
impl WorldPortalExt for BlockRegistry {
|
|
fn can_place_at(
|
|
&self,
|
|
_block: &pumpkin_data::Block,
|
|
_state: &pumpkin_data::BlockState,
|
|
_block_accessor: &dyn pumpkin_world::world::BlockAccessor,
|
|
_block_pos: &pumpkin_util::math::position::BlockPos,
|
|
) -> bool {
|
|
true
|
|
}
|
|
|
|
fn mirror(
|
|
&self,
|
|
block: &pumpkin_data::Block,
|
|
state_id: BlockStateId,
|
|
mirror: pumpkin_data::Mirror,
|
|
) -> &'static pumpkin_data::BlockState {
|
|
block.mirror(state_id, mirror)
|
|
}
|
|
|
|
fn rotate(
|
|
&self,
|
|
block: &pumpkin_data::Block,
|
|
state_id: BlockStateId,
|
|
rotation: pumpkin_data::Rotation,
|
|
) -> &'static pumpkin_data::BlockState {
|
|
block.rotate(state_id, rotation)
|
|
}
|
|
|
|
fn spawn_mobs_for_chunk_generation(
|
|
&self,
|
|
_cache: &mut dyn pumpkin_world::generation::proto_chunk::GenerationCache,
|
|
_biome: &'static pumpkin_data::chunk::Biome,
|
|
_chunk_x: i32,
|
|
_chunk_z: i32,
|
|
) {
|
|
}
|
|
}
|
|
|
|
fn bench_chunk_deserialization(c: &mut Criterion) {
|
|
let dimension = Dimension::OVERWORLD;
|
|
let world_gen = get_world_gen(
|
|
Seed(42),
|
|
dimension.clone(),
|
|
false,
|
|
Vec::new(),
|
|
String::new(),
|
|
);
|
|
let chunk = generate_single_chunk(
|
|
&dimension,
|
|
0,
|
|
&world_gen,
|
|
&BlockRegistry,
|
|
0,
|
|
0,
|
|
StagedChunkEnum::Full,
|
|
);
|
|
let Chunk::Level(chunk) = chunk else {
|
|
panic!("full generation must return a level chunk");
|
|
};
|
|
let runtime = tokio::runtime::Builder::new_current_thread()
|
|
.build()
|
|
.expect("failed to create benchmark runtime");
|
|
let bytes = runtime
|
|
.block_on(chunk.to_bytes())
|
|
.expect("failed to serialize benchmark chunk");
|
|
let position = Vector2::new(chunk.x, chunk.z);
|
|
|
|
c.bench_function("chunk_nbt_deserialization", |b| {
|
|
b.iter(|| {
|
|
black_box(
|
|
ChunkData::from_bytes(black_box(&bytes), position)
|
|
.expect("failed to deserialize benchmark chunk"),
|
|
);
|
|
});
|
|
});
|
|
}
|
|
|
|
criterion_group!(benches, bench_chunk_deserialization);
|
|
criterion_main!(benches);
|