combobulator: use up to 16 parallel requests
This commit is contained in:
1
Cargo.lock
generated
1
Cargo.lock
generated
@@ -2356,6 +2356,7 @@ dependencies = [
|
|||||||
"async-nats",
|
"async-nats",
|
||||||
"aws-config",
|
"aws-config",
|
||||||
"aws-sdk-s3",
|
"aws-sdk-s3",
|
||||||
|
"futures-util",
|
||||||
"map-tool",
|
"map-tool",
|
||||||
"rbx_asset",
|
"rbx_asset",
|
||||||
"rbx_binary",
|
"rbx_binary",
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ edition = "2024"
|
|||||||
async-nats.workspace = true
|
async-nats.workspace = true
|
||||||
aws-config = { version = "1", features = ["behavior-version-latest"] }
|
aws-config = { version = "1", features = ["behavior-version-latest"] }
|
||||||
aws-sdk-s3 = "1"
|
aws-sdk-s3 = "1"
|
||||||
|
futures-util.workspace = true
|
||||||
map-tool = { version = "3.0.0", registry = "strafesnet", features = ["roblox"], default-features = false }
|
map-tool = { version = "3.0.0", registry = "strafesnet", features = ["roblox"], default-features = false }
|
||||||
rbx_asset.workspace = true
|
rbx_asset.workspace = true
|
||||||
rbx_binary.workspace = true
|
rbx_binary.workspace = true
|
||||||
|
|||||||
@@ -3,8 +3,12 @@ use std::io::Cursor;
|
|||||||
use crate::nats_types::ReleaseMapfixRequest;
|
use crate::nats_types::ReleaseMapfixRequest;
|
||||||
use crate::s3::S3Cache;
|
use crate::s3::S3Cache;
|
||||||
|
|
||||||
|
use futures_util::stream::iter as stream_iter;
|
||||||
|
use futures_util::{StreamExt,TryStreamExt};
|
||||||
use strafesnet_deferred_loader::deferred_loader::LoadFailureMode;
|
use strafesnet_deferred_loader::deferred_loader::LoadFailureMode;
|
||||||
|
|
||||||
|
const CONCURRENT_REQUESTS:usize=16;
|
||||||
|
|
||||||
#[expect(dead_code)]
|
#[expect(dead_code)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum ConvertError{
|
pub enum ConvertError{
|
||||||
@@ -121,10 +125,9 @@ impl Processor{
|
|||||||
let assets=map_tool::roblox::get_unique_assets(&dom);
|
let assets=map_tool::roblox::get_unique_assets(&dom);
|
||||||
|
|
||||||
// place textures into 'loader'
|
// place textures into 'loader'
|
||||||
let mut texture_loader=crate::loader::TextureLoader::new();
|
let texture_loader=crate::loader::TextureLoader::new();
|
||||||
|
|
||||||
// process textures: download, cache, convert to DDS
|
// process textures: download, cache, convert to DDS
|
||||||
for &id in &assets.textures{
|
let texture_loader=stream_iter(assets.textures).map(async|id|{
|
||||||
let asset_id=id.0;
|
let asset_id=id.0;
|
||||||
let dds_key=S3Cache::texture_dds_key(asset_id);
|
let dds_key=S3Cache::texture_dds_key(asset_id);
|
||||||
|
|
||||||
@@ -138,7 +141,9 @@ impl Processor{
|
|||||||
map_tool::roblox::convert_texture_to_dds(&data)
|
map_tool::roblox::convert_texture_to_dds(&data)
|
||||||
}else{
|
}else{
|
||||||
println!("[combobulator] Downloading texture {asset_id}");
|
println!("[combobulator] Downloading texture {asset_id}");
|
||||||
let Some(data)=self.download_asset(asset_id).await? else{continue};
|
let Some(data)=self.download_asset(asset_id).await? else{
|
||||||
|
return Ok(None);
|
||||||
|
};
|
||||||
|
|
||||||
// decode while we have ownership
|
// decode while we have ownership
|
||||||
let dds_result=map_tool::roblox::convert_texture_to_dds(&data);
|
let dds_result=map_tool::roblox::convert_texture_to_dds(&data);
|
||||||
@@ -152,7 +157,7 @@ impl Processor{
|
|||||||
Ok(dds)=>dds,
|
Ok(dds)=>dds,
|
||||||
Err(e)=>{
|
Err(e)=>{
|
||||||
println!("[combobulator] Texture {asset_id} convert error: {e}");
|
println!("[combobulator] Texture {asset_id} convert error: {e}");
|
||||||
continue;
|
return Ok(None);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -162,12 +167,19 @@ impl Processor{
|
|||||||
};
|
};
|
||||||
println!("[combobulator] Texture {asset_id} processed");
|
println!("[combobulator] Texture {asset_id} processed");
|
||||||
|
|
||||||
texture_loader.insert(id,dds);
|
Ok(Some((id,dds)))
|
||||||
}
|
})
|
||||||
|
.buffer_unordered(CONCURRENT_REQUESTS)
|
||||||
|
.try_fold(texture_loader,async|mut texture_loader,maybe_loaded_texture|{
|
||||||
|
if let Some((id,dds))=maybe_loaded_texture{
|
||||||
|
texture_loader.insert(id,dds);
|
||||||
|
}
|
||||||
|
Ok(texture_loader)
|
||||||
|
}).await?;
|
||||||
|
|
||||||
let mut mesh_loader=crate::loader::MeshLoader::new();
|
let mesh_loader=crate::loader::MeshLoader::new();
|
||||||
// process meshes
|
// process meshes
|
||||||
for &id in &assets.meshes{
|
let mesh_loader=stream_iter(assets.meshes).map(async|id|{
|
||||||
let asset_id=id.0;
|
let asset_id=id.0;
|
||||||
let mesh_key=S3Cache::mesh_key(asset_id);
|
let mesh_key=S3Cache::mesh_key(asset_id);
|
||||||
|
|
||||||
@@ -175,7 +187,9 @@ impl Processor{
|
|||||||
strafesnet_rbx_loader::mesh::convert(&data)
|
strafesnet_rbx_loader::mesh::convert(&data)
|
||||||
}else{
|
}else{
|
||||||
println!("[combobulator] Downloading mesh {asset_id}");
|
println!("[combobulator] Downloading mesh {asset_id}");
|
||||||
let Some(data)=self.download_asset(asset_id).await? else{continue};
|
let Some(data)=self.download_asset(asset_id).await? else{
|
||||||
|
return Ok(None);
|
||||||
|
};
|
||||||
|
|
||||||
// decode while we have ownership
|
// decode while we have ownership
|
||||||
let mesh_result=strafesnet_rbx_loader::mesh::convert(&data);
|
let mesh_result=strafesnet_rbx_loader::mesh::convert(&data);
|
||||||
@@ -187,13 +201,23 @@ impl Processor{
|
|||||||
|
|
||||||
// handle error after cacheing data
|
// handle error after cacheing data
|
||||||
match mesh_result{
|
match mesh_result{
|
||||||
Ok(mesh)=>mesh_loader.insert_mesh(id,mesh),
|
Ok(mesh)=>Ok(Some((id,mesh))),
|
||||||
Err(e)=>println!("[combobulator] Mesh {asset_id} convert error: {e}"),
|
Err(e)=>{
|
||||||
|
println!("[combobulator] Mesh {asset_id} convert error: {e}");
|
||||||
|
Ok(None)
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
|
.buffer_unordered(CONCURRENT_REQUESTS)
|
||||||
|
.try_fold(mesh_loader,async|mut mesh_loader,maybe_loaded_mesh|{
|
||||||
|
if let Some((id,mesh))=maybe_loaded_mesh{
|
||||||
|
mesh_loader.insert_mesh(id,mesh);
|
||||||
|
}
|
||||||
|
Ok(mesh_loader)
|
||||||
|
}).await?;
|
||||||
|
|
||||||
// process unions
|
// process unions
|
||||||
for &id in &assets.unions{
|
let mesh_loader=stream_iter(assets.unions).map(async|id|{
|
||||||
let asset_id=id.0;
|
let asset_id=id.0;
|
||||||
let union_key=S3Cache::union_key(asset_id);
|
let union_key=S3Cache::union_key(asset_id);
|
||||||
|
|
||||||
@@ -201,7 +225,9 @@ impl Processor{
|
|||||||
rbx_binary::from_reader(data.as_slice())
|
rbx_binary::from_reader(data.as_slice())
|
||||||
}else{
|
}else{
|
||||||
println!("[combobulator] Downloading union {asset_id}");
|
println!("[combobulator] Downloading union {asset_id}");
|
||||||
let Some(data)=self.download_asset(asset_id).await? else{continue};
|
let Some(data)=self.download_asset(asset_id).await? else{
|
||||||
|
return Ok(None);
|
||||||
|
};
|
||||||
|
|
||||||
// decode the data while we have ownership
|
// decode the data while we have ownership
|
||||||
let union_result=rbx_binary::from_reader(data.as_slice());
|
let union_result=rbx_binary::from_reader(data.as_slice());
|
||||||
@@ -213,10 +239,20 @@ impl Processor{
|
|||||||
|
|
||||||
// handle error after cacheing data
|
// handle error after cacheing data
|
||||||
match union_result{
|
match union_result{
|
||||||
Ok(union)=>mesh_loader.insert_union(id,union),
|
Ok(union)=>Ok(Some((id,union))),
|
||||||
Err(e)=>println!("[combobulator] Union {asset_id} convert error: {e}"),
|
Err(e)=>{
|
||||||
|
println!("[combobulator] Union {asset_id} convert error: {e}");
|
||||||
|
Ok(None)
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
|
.buffer_unordered(CONCURRENT_REQUESTS)
|
||||||
|
.try_fold(mesh_loader,async|mut mesh_loader,maybe_loaded_union|{
|
||||||
|
if let Some((id,union))=maybe_loaded_union{
|
||||||
|
mesh_loader.insert_union(id,union);
|
||||||
|
}
|
||||||
|
Ok(mesh_loader)
|
||||||
|
}).await?;
|
||||||
|
|
||||||
// convert to SNF and upload
|
// convert to SNF and upload
|
||||||
println!("[combobulator] Converting to SNF");
|
println!("[combobulator] Converting to SNF");
|
||||||
|
|||||||
Reference in New Issue
Block a user