mindustry logic execution, map- and schematic- parsing and rendering
add render::warmup() and timing in `map`
| -rw-r--r-- | Cargo.toml | 2 | ||||
| -rw-r--r-- | src/data/renderer.rs | 9 | ||||
| -rw-r--r-- | src/exe/map.rs | 43 |
3 files changed, 43 insertions, 11 deletions
@@ -1,6 +1,6 @@ [package] name = "mindus" -version = "1.4.9" +version = "1.5.0" edition = "2021" description = "A library for working with mindustry data formats (eg schematics and maps) (fork of plandustry)" authors = [ diff --git a/src/data/renderer.rs b/src/data/renderer.rs index 502c81e..89a1b89 100644 --- a/src/data/renderer.rs +++ b/src/data/renderer.rs @@ -298,6 +298,15 @@ impl Renderable for Map<'_> { } } +/// Loads all the images into memory +pub fn warmup() { + for map in [&FULL, &QUAR, &EIGH] { + for val in map.values() { + LazyLock::force(val); + } + } +} + #[test] fn all_blocks() { use crate::block::content::Type; diff --git a/src/exe/map.rs b/src/exe/map.rs index c85039d..fb55e07 100644 --- a/src/exe/map.rs +++ b/src/exe/map.rs @@ -1,7 +1,9 @@ +use mindus::data::renderer::warmup; use mindus::data::DataRead; use mindus::{build_registry, Renderable}; use mindus::{MapSerializer, Serializer}; use std::env::Args; +use std::time::Instant; use super::print_err; pub fn main(args: Args) { @@ -9,18 +11,39 @@ pub fn main(args: Args) { let mut ms = MapSerializer(®); // process schematics from command line + println!("starting timing"); + let then = Instant::now(); + warmup(); + let warmup_took = then.elapsed(); for curr in args { - if let Ok(s) = std::fs::read(curr) { - match ms.deserialize(&mut DataRead::new(&s)) { - Err(e) => print_err!(e, "fail"), - Ok(m) => { - let o = m.render(); - if let Ok(v) = std::env::var("SAVE") { - if v == "1" { - o.save("x.png").unwrap(); - } - } + let Ok(s) = std::fs::read(curr) else { + continue; + }; + let starting_deser = Instant::now(); + match ms.deserialize(&mut DataRead::new(&s)) { + Err(e) => print_err!(e, "fail"), + Ok(m) => { + let deser_took = starting_deser.elapsed(); + if let Ok(v) = std::env::var("SAVE") { + if v == "1" { + m.render().save("x.png").unwrap(); + continue; + } } + let starting_render = Instant::now(); + for _ in 0..10 { + m.render(); + } + let renders_took = starting_render.elapsed(); + let took = then.elapsed(); + println!( + "μ total: {:.2}s (10 runs) (deser: {}ms, warmup: {}ms, render: {:.2}s) on map {}", + took.as_secs_f32() / 10., + deser_took.as_millis(), + warmup_took.as_millis(), + renders_took.as_secs_f32() / 10., + m.tags.get("mapname").unwrap(), + ); } } } |