perf(replay/recorder): buffer writes to zip file

This commit is contained in:
Ryan 2025-03-13 19:49:08 -04:00
parent e1683f41c6
commit 34dc14d6b2
Signed by: ErrorNoInternet
GPG Key ID: 2486BFB7B1E6A4A3

View File

@ -9,14 +9,14 @@ use log::debug;
use serde_json::json; use serde_json::json;
use std::{ use std::{
fs::File, fs::File,
io::Write, io::{BufWriter, Write},
time::{Instant, SystemTime, UNIX_EPOCH}, time::{Instant, SystemTime, UNIX_EPOCH},
}; };
use zip::{ZipWriter, write::SimpleFileOptions}; use zip::{ZipWriter, write::SimpleFileOptions};
#[derive(Resource)] #[derive(Resource)]
pub struct Recorder { pub struct Recorder {
zip_writer: ZipWriter<File>, zip_writer: BufWriter<ZipWriter<File>>,
start: Instant, start: Instant,
server: String, server: String,
pub should_ignore_compression: bool, pub should_ignore_compression: bool,
@ -33,20 +33,20 @@ impl Recorder {
); );
zip_writer.start_file("recording.tmcpr", SimpleFileOptions::default())?; zip_writer.start_file("recording.tmcpr", SimpleFileOptions::default())?;
Ok(Self { Ok(Self {
zip_writer, zip_writer: BufWriter::new(zip_writer),
start: Instant::now(), start: Instant::now(),
server, server,
should_ignore_compression, should_ignore_compression,
}) })
} }
pub fn finish(mut self) -> Result<()> { pub fn finish(self) -> Result<()> {
debug!("finishing replay recording"); debug!("finishing replay recording");
let elapsed = self.start.elapsed().as_millis(); let elapsed = self.start.elapsed().as_millis();
self.zip_writer let mut zip_writer = self.zip_writer.into_inner()?;
.start_file("metaData.json", SimpleFileOptions::default())?; zip_writer.start_file("metaData.json", SimpleFileOptions::default())?;
self.zip_writer.write_all( zip_writer.write_all(
json!({ json!({
"singleplayer": false, "singleplayer": false,
"serverName": self.server, "serverName": self.server,
@ -61,7 +61,7 @@ impl Recorder {
.to_string() .to_string()
.as_bytes(), .as_bytes(),
)?; )?;
self.zip_writer.finish()?; zip_writer.finish()?;
debug!("finished replay recording"); debug!("finished replay recording");
Ok(()) Ok(())