aboutsummaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
authorValentin Popov <valentin@popov.link>2026-07-18 12:28:27 +0300
committerValentin Popov <valentin@popov.link>2026-07-18 12:28:27 +0300
commit564edf0bc1d5fed1cbfc00db2ba5c4cd9d1b94ea (patch)
tree5774de073f48c44195c149298bb67d4f2f12da95 /crates
parent2474e480200a8dfa260a069730c19c4bb2cbdf8e (diff)
downloadfparkan-564edf0bc1d5fed1cbfc00db2ba5c4cd9d1b94ea.tar.xz
fparkan-564edf0bc1d5fed1cbfc00db2ba5c4cd9d1b94ea.zip
feat(runtime): trace visual cache sizes
Diffstat (limited to 'crates')
-rw-r--r--crates/fparkan-assets/src/lib.rs147
-rw-r--r--crates/fparkan-runtime/src/lib.rs18
2 files changed, 134 insertions, 31 deletions
diff --git a/crates/fparkan-assets/src/lib.rs b/crates/fparkan-assets/src/lib.rs
index 6e3364d..58fa5ed 100644
--- a/crates/fparkan-assets/src/lib.rs
+++ b/crates/fparkan-assets/src/lib.rs
@@ -52,6 +52,7 @@ const VISUAL_DEPENDENCY_PROGRESS_INTERVAL: usize = 64;
type WearValidationCache =
HashMap<(NormalizedPath, Vec<u8>), Result<fparkan_material::WearTable, String>>;
+type TextureValidationCache = HashMap<Vec<u8>, Result<(), String>>;
/// Canonical terrain archive paths derived from a mission land reference.
#[derive(Clone, Debug, Eq, PartialEq)]
@@ -483,6 +484,17 @@ pub enum VisualDependencyPhase {
Texture,
}
+/// Validation-cache entries retained while expanding visual dependencies.
+#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
+pub struct VisualDependencyCacheCounts {
+ /// Distinct WEAR archive/name keys resolved so far.
+ pub wear_entries: usize,
+ /// Distinct MAT0 raw names resolved so far.
+ pub material_entries: usize,
+ /// Distinct TEXM archive/name keys resolved so far.
+ pub texture_entries: usize,
+}
+
/// Throttled visual-dependency expansion progress.
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct VisualDependencyProgress {
@@ -494,6 +506,8 @@ pub struct VisualDependencyProgress {
pub graph_node_count: usize,
/// Resource graph edges materialized before this request is resolved.
pub graph_edge_count: usize,
+ /// Validation-cache entries retained before this request is resolved.
+ pub cache_entries: VisualDependencyCacheCounts,
}
/// Errors raised while preparing CPU-side assets.
@@ -1241,10 +1255,18 @@ pub fn extend_graph_report_with_visual_dependencies_with_progress<R: ResourceRep
wear_requests = wear_requests.saturating_add(1);
report_visual_dependency_progress(
&mut on_progress,
- VisualDependencyPhase::Wear,
- wear_requests,
- graph.nodes.len(),
- graph.edges.len(),
+ VisualDependencyProgress {
+ phase: VisualDependencyPhase::Wear,
+ request_count: wear_requests,
+ graph_node_count: graph.nodes.len(),
+ graph_edge_count: graph.edges.len(),
+ cache_entries: visual_dependency_cache_counts(
+ &wear_validation,
+ &material_validation,
+ &diffuse_texture_validation,
+ &lightmap_texture_validation,
+ ),
+ },
);
match resolve_wear_table_cached(repository, mesh, &mut wear_validation) {
Ok(table) => {
@@ -1289,15 +1311,29 @@ pub fn extend_graph_report_with_visual_dependencies_with_progress<R: ResourceRep
request_count: material_requests,
graph_node_count: graph.nodes.len(),
graph_edge_count: graph.edges.len(),
+ cache_entries: visual_dependency_cache_counts(
+ &wear_validation,
+ &material_validation,
+ &diffuse_texture_validation,
+ &lightmap_texture_validation,
+ ),
});
for (material_index, _entry) in table.entries.iter().enumerate() {
material_requests = material_requests.saturating_add(1);
report_visual_dependency_progress(
&mut on_progress,
- VisualDependencyPhase::Material,
- material_requests,
- graph.nodes.len(),
- graph.edges.len(),
+ VisualDependencyProgress {
+ phase: VisualDependencyPhase::Material,
+ request_count: material_requests,
+ graph_node_count: graph.nodes.len(),
+ graph_edge_count: graph.edges.len(),
+ cache_entries: visual_dependency_cache_counts(
+ &wear_validation,
+ &material_validation,
+ &diffuse_texture_validation,
+ &lightmap_texture_validation,
+ ),
+ },
);
let Ok(material_index) = u16::try_from(material_index) else {
push_visual_failure(
@@ -1347,10 +1383,18 @@ pub fn extend_graph_report_with_visual_dependencies_with_progress<R: ResourceRep
texture_requests = texture_requests.saturating_add(1);
report_visual_dependency_progress(
&mut on_progress,
- VisualDependencyPhase::Texture,
- texture_requests,
- graph.nodes.len(),
- graph.edges.len(),
+ VisualDependencyProgress {
+ phase: VisualDependencyPhase::Texture,
+ request_count: texture_requests,
+ graph_node_count: graph.nodes.len(),
+ graph_edge_count: graph.edges.len(),
+ cache_entries: visual_dependency_cache_counts(
+ &wear_validation,
+ &material_validation,
+ &diffuse_texture_validation,
+ &lightmap_texture_validation,
+ ),
+ },
);
report.texture_request_count += 1;
match resolve_texm_validation_cached(
@@ -1415,10 +1459,18 @@ pub fn extend_graph_report_with_visual_dependencies_with_progress<R: ResourceRep
texture_requests = texture_requests.saturating_add(1);
report_visual_dependency_progress(
&mut on_progress,
- VisualDependencyPhase::Texture,
- texture_requests,
- graph.nodes.len(),
- graph.edges.len(),
+ VisualDependencyProgress {
+ phase: VisualDependencyPhase::Texture,
+ request_count: texture_requests,
+ graph_node_count: graph.nodes.len(),
+ graph_edge_count: graph.edges.len(),
+ cache_entries: visual_dependency_cache_counts(
+ &wear_validation,
+ &material_validation,
+ &diffuse_texture_validation,
+ &lightmap_texture_validation,
+ ),
+ },
);
report.lightmap_request_count += 1;
match resolve_texm_validation_cached(
@@ -1484,18 +1536,29 @@ pub fn extend_graph_report_with_visual_dependencies_with_progress<R: ResourceRep
fn report_visual_dependency_progress(
on_progress: &mut impl FnMut(VisualDependencyProgress),
- phase: VisualDependencyPhase,
- request_count: usize,
- graph_node_count: usize,
- graph_edge_count: usize,
+ progress: VisualDependencyProgress,
) {
- if request_count == 1 || request_count.is_multiple_of(VISUAL_DEPENDENCY_PROGRESS_INTERVAL) {
- on_progress(VisualDependencyProgress {
- phase,
- request_count,
- graph_node_count,
- graph_edge_count,
- });
+ if progress.request_count == 1
+ || progress
+ .request_count
+ .is_multiple_of(VISUAL_DEPENDENCY_PROGRESS_INTERVAL)
+ {
+ on_progress(progress);
+ }
+}
+
+fn visual_dependency_cache_counts(
+ wear_validation: &WearValidationCache,
+ material_validation: &HashMap<Vec<u8>, Result<ResolvedMaterial, String>>,
+ diffuse_texture_validation: &TextureValidationCache,
+ lightmap_texture_validation: &TextureValidationCache,
+) -> VisualDependencyCacheCounts {
+ VisualDependencyCacheCounts {
+ wear_entries: wear_validation.len(),
+ material_entries: material_validation.len(),
+ texture_entries: diffuse_texture_validation
+ .len()
+ .saturating_add(lightmap_texture_validation.len()),
}
}
@@ -2336,10 +2399,17 @@ mod tests {
for request_count in 1..=129 {
report_visual_dependency_progress(
&mut |event| progress.push(event),
- VisualDependencyPhase::Texture,
- request_count,
- 37,
- 41,
+ VisualDependencyProgress {
+ phase: VisualDependencyPhase::Texture,
+ request_count,
+ graph_node_count: 37,
+ graph_edge_count: 41,
+ cache_entries: VisualDependencyCacheCounts {
+ wear_entries: 3,
+ material_entries: 5,
+ texture_entries: 7,
+ },
+ },
);
}
@@ -2351,18 +2421,33 @@ mod tests {
request_count: 1,
graph_node_count: 37,
graph_edge_count: 41,
+ cache_entries: VisualDependencyCacheCounts {
+ wear_entries: 3,
+ material_entries: 5,
+ texture_entries: 7,
+ },
},
VisualDependencyProgress {
phase: VisualDependencyPhase::Texture,
request_count: 64,
graph_node_count: 37,
graph_edge_count: 41,
+ cache_entries: VisualDependencyCacheCounts {
+ wear_entries: 3,
+ material_entries: 5,
+ texture_entries: 7,
+ },
},
VisualDependencyProgress {
phase: VisualDependencyPhase::Texture,
request_count: 128,
graph_node_count: 37,
graph_edge_count: 41,
+ cache_entries: VisualDependencyCacheCounts {
+ wear_entries: 3,
+ material_entries: 5,
+ texture_entries: 7,
+ },
},
]
);
diff --git a/crates/fparkan-runtime/src/lib.rs b/crates/fparkan-runtime/src/lib.rs
index 1ab8e38..a80d58e 100644
--- a/crates/fparkan-runtime/src/lib.rs
+++ b/crates/fparkan-runtime/src/lib.rs
@@ -133,6 +133,12 @@ pub enum MissionLoadPhase {
graph_node_count: usize,
/// Graph edges materialized before the request.
graph_edge_count: usize,
+ /// Distinct WEAR validation keys retained before the request.
+ wear_cache_entries: usize,
+ /// Distinct MAT0 validation keys retained before the request.
+ material_cache_entries: usize,
+ /// Distinct TEXM validation keys retained before the request.
+ texture_cache_entries: usize,
},
/// Validate TEXM documents while expanding visual dependencies.
GraphVisualTextures,
@@ -144,6 +150,12 @@ pub enum MissionLoadPhase {
graph_node_count: usize,
/// Graph edges materialized before the request.
graph_edge_count: usize,
+ /// Distinct WEAR validation keys retained before the request.
+ wear_cache_entries: usize,
+ /// Distinct MAT0 validation keys retained before the request.
+ material_cache_entries: usize,
+ /// Distinct TEXM validation keys retained before the request.
+ texture_cache_entries: usize,
},
/// Prepare all reachable visual/resource dependencies.
Assets,
@@ -747,6 +759,9 @@ fn load_mission_with_options_and_progress(
request_count: progress.request_count,
graph_node_count: progress.graph_node_count,
graph_edge_count: progress.graph_edge_count,
+ wear_cache_entries: progress.cache_entries.wear_entries,
+ material_cache_entries: progress.cache_entries.material_entries,
+ texture_cache_entries: progress.cache_entries.texture_entries,
})
}
VisualDependencyPhase::Texture => {
@@ -754,6 +769,9 @@ fn load_mission_with_options_and_progress(
request_count: progress.request_count,
graph_node_count: progress.graph_node_count,
graph_edge_count: progress.graph_edge_count,
+ wear_cache_entries: progress.cache_entries.wear_entries,
+ material_cache_entries: progress.cache_entries.material_entries,
+ texture_cache_entries: progress.cache_entries.texture_entries,
})
}
};