mindustry logic execution, map- and schematic- parsing and rendering
-rw-r--r--Cargo.toml2
-rw-r--r--src/data/renderer.rs9
-rw-r--r--src/exe/map.rs43
3 files changed, 43 insertions, 11 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 1d8498c..147734c 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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(&reg);
// 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(),
+ );
}
}
}