Performance Profiling
Understanding the performance of your plugins is crucial for maintaining a smooth user experience, especially in a real-time 3D environment like the Foresight SDK.
Using Spans for Profiling
The primary way to profile code in the Foresight SDK is by instrumenting it with tracing spans. By wrapping a block of code in a span, you record how long it takes to execute.
use tracing::info_span;
pub fn heavy_computation() {
let _span = info_span!("heavy_computation").entered();
// Your complex logic here...
}Or using the #[instrument] attribute:
use tracing::instrument;
#[instrument(skip_all)]
pub fn complex_system() {
// This entire function is now a span.
}Built-in Profiler
The Foresight SDK includes a built-in profiler that can visualize these spans in real-time. This is often the quickest way to identify which systems or tools are consuming the most frame time.
Opening Developer Tools
You can open the built-in developer tools and profiler using the following keyboard shortcut:
- macOS:
⌘ + Shift + I - Windows/Linux:
Ctrl + Shift + I
The developer tools panel provides access to real-time performance metrics, span timelines, and other diagnostic utilities.
Third-Party Tools: Tracy
For more in-depth analysis, the SDK supports Tracy, a powerful graphical profiler. Tracy provides a detailed timeline of all spans across different threads, along with memory allocation tracking and more.
How to use Tracy:
- Build with Tracy support: Enable the
trace_tracyfeature when building the client.cargo run --features trace_tracy - Run Tracy: Download and run the Tracy profiler application on your machine.
- Connect: The client will automatically attempt to connect to the Tracy application when it starts.
Best Practices
- Instrument key systems: Add spans to your main Bevy systems and any long-running asynchronous tasks.
- Keep spans meaningful: Use descriptive names for your spans.
- Avoid excessive overhead: While
tracingis efficient, adding thousands of very short spans in a tight loop can impact performance.