Add System Command apply and RenderGraph node spans (#3069)

This fills in most of the gaps in tracing visualizations and should help with discovering bottlenecks.
This commit is contained in:
Carter Anderson 2021-11-06 20:15:36 +00:00
parent 09706cdb2a
commit fde5d2fe46
2 changed files with 30 additions and 16 deletions

View file

@ -208,7 +208,12 @@ impl SystemStage {
pub fn apply_buffers(&mut self, world: &mut World) { pub fn apply_buffers(&mut self, world: &mut World) {
for container in self.parallel.iter_mut() { for container in self.parallel.iter_mut() {
container.system_mut().apply_buffers(world); let system = container.system_mut();
#[cfg(feature = "trace")]
let span = bevy_utils::tracing::info_span!("system_commands", name = &*system.name());
#[cfg(feature = "trace")]
let _guard = span.enter();
system.apply_buffers(world);
} }
} }

View file

@ -1,9 +1,10 @@
use bevy_ecs::world::World; use bevy_ecs::world::World;
use bevy_utils::{ #[cfg(feature = "trace")]
tracing::{debug, info_span}, use bevy_utils::tracing::info_span;
HashMap, use bevy_utils::HashMap;
};
use smallvec::{smallvec, SmallVec}; use smallvec::{smallvec, SmallVec};
#[cfg(feature = "trace")]
use std::ops::Deref;
use std::{borrow::Cow, collections::VecDeque}; use std::{borrow::Cow, collections::VecDeque};
use thiserror::Error; use thiserror::Error;
@ -56,13 +57,11 @@ impl RenderGraphRunner {
command_encoder, command_encoder,
}; };
Self::run_graph(graph, None, &mut render_context, world, &[])?;
{ {
let span = info_span!("run_graph"); #[cfg(feature = "trace")]
let _guard = span.enter();
Self::run_graph(graph, None, &mut render_context, world, &[])?;
}
{
let span = info_span!("submit_graph_commands"); let span = info_span!("submit_graph_commands");
#[cfg(feature = "trace")]
let _guard = span.enter(); let _guard = span.enter();
queue.submit(vec![render_context.command_encoder.finish()]); queue.submit(vec![render_context.command_encoder.finish()]);
} }
@ -77,9 +76,14 @@ impl RenderGraphRunner {
inputs: &[SlotValue], inputs: &[SlotValue],
) -> Result<(), RenderGraphRunnerError> { ) -> Result<(), RenderGraphRunnerError> {
let mut node_outputs: HashMap<NodeId, SmallVec<[SlotValue; 4]>> = HashMap::default(); let mut node_outputs: HashMap<NodeId, SmallVec<[SlotValue; 4]>> = HashMap::default();
debug!("-----------------"); #[cfg(feature = "trace")]
debug!("Begin Graph Run: {:?}", graph_name); let span = if let Some(name) = &graph_name {
debug!("-----------------"); info_span!("run_graph", name = name.deref())
} else {
info_span!("run_graph", name = "main_graph")
};
#[cfg(feature = "trace")]
let _guard = span.enter();
// Queue up nodes without inputs, which can be run immediately // Queue up nodes without inputs, which can be run immediately
let mut node_queue: VecDeque<&NodeState> = graph let mut node_queue: VecDeque<&NodeState> = graph
@ -166,14 +170,20 @@ impl RenderGraphRunner {
smallvec![None; node_state.output_slots.len()]; smallvec![None; node_state.output_slots.len()];
{ {
let mut context = RenderGraphContext::new(graph, node_state, &inputs, &mut outputs); let mut context = RenderGraphContext::new(graph, node_state, &inputs, &mut outputs);
debug!(" Run Node {}", node_state.type_name); #[cfg(feature = "trace")]
let span = info_span!("node", name = node_state.type_name);
#[cfg(feature = "trace")]
let guard = span.enter();
node_state.node.run(&mut context, render_context, world)?; node_state.node.run(&mut context, render_context, world)?;
#[cfg(feature = "trace")]
drop(guard);
for run_sub_graph in context.finish() { for run_sub_graph in context.finish() {
let sub_graph = graph let sub_graph = graph
.get_sub_graph(&run_sub_graph.name) .get_sub_graph(&run_sub_graph.name)
.expect("sub graph exists because it was validated when queued."); .expect("sub graph exists because it was validated when queued.");
debug!(" Run Sub Graph {}", node_state.type_name);
Self::run_graph( Self::run_graph(
sub_graph, sub_graph,
Some(run_sub_graph.name), Some(run_sub_graph.name),
@ -204,7 +214,6 @@ impl RenderGraphRunner {
} }
} }
debug!("finish graph: {:?}", graph_name);
Ok(()) Ok(())
} }
} }