use super::{BenchWorld, bench};
use crate::components::{GlobalTransform, Prop, RenderHandle, SkeletonPose};
use crate::ecs::{Entity, SkinnedMeshHandle};
use crate::gfx::graphics_system::GraphicsSystem;
use crate::gfx::snapshot::RenderSnapshot;
const SMALL: usize = 100;
const LARGE: usize = 20_000;
const JOINTS: usize = 64;
fn model_at(i: usize) -> [[f32; 4]; 4] {
[
[1.0, 0.0, 0.0, 0.0],
[0.0, 1.0, 0.0, 0.0],
[0.0, 0.0, 1.0, 0.0],
[i as f32, 0.0, 0.0, 1.0],
]
}
fn draw_world(count: usize) -> (BenchWorld, Vec<Entity>) {
let mut world = BenchWorld::new();
let entities = (0..count)
.map(|i| {
let entity = world.components.push_typed(Prop::default());
world
.components
.insert_typed(entity, GlobalTransform(model_at(i)));
world.components.insert_typed(
entity,
RenderHandle {
draws: [i as u32].into(),
},
);
entity
})
.collect();
(world, entities)
}
fn pose_world(count: usize) -> BenchWorld {
let mut world = BenchWorld::new();
for i in 0..count {
let entity = world.components.push_typed(Prop::default());
world.components.insert_typed(
entity,
SkeletonPose {
mesh_id: SkinnedMeshHandle(i as u32),
skinned_index: i,
skeleton: crate::gfx::skeleton::Skeleton::new(Vec::new()),
joint_matrices: vec![model_at(i); JOINTS],
morph_weights: Vec::new(),
morph_base: Vec::new(),
proportions: Default::default(),
updated: true,
scratch: Default::default(),
},
);
}
world
}
#[test]
#[ignore = "microbench; see crate::bench for the command"]
fn render_extraction() {
println!("\nrender extraction");
for (name, count) in [("extract_static/100", SMALL), ("extract_static/20k", LARGE)] {
let (mut world, _) = draw_world(count);
let mut gs = GraphicsSystem::new(None);
let mut snap = RenderSnapshot::default();
gs.extract(&mut world.ctx(), &mut snap);
bench(name, count as u64, || {
gs.extract(&mut world.ctx(), &mut snap);
});
}
for (name, count) in [("extract_moved/100", SMALL), ("extract_moved/20k", LARGE)] {
let (mut world, _) = draw_world(count);
let mut gs = GraphicsSystem::new(None);
let mut snap = RenderSnapshot::default();
gs.extract(&mut world.ctx(), &mut snap);
let mut pass = 0.0f32;
bench(name, count as u64, || {
pass += 0.001;
for g in world.ctx().query_slice_mut::<GlobalTransform>() {
g.0[3][1] = pass;
}
gs.extract(&mut world.ctx(), &mut snap);
});
}
{
let mut world = pose_world(SMALL);
let mut gs = GraphicsSystem::new(None);
let mut snap = RenderSnapshot::default();
gs.extract(&mut world.ctx(), &mut snap);
bench(
&format!("extract_poses_{JOINTS}j/100"),
SMALL as u64,
|| {
for pose in world.ctx().query_mut::<SkeletonPose>() {
pose.updated = true;
}
gs.extract(&mut world.ctx(), &mut snap);
},
);
}
}