Path: blob/main/crates/bevy_render/src/diagnostic/render_asset_diagnostic_plugin.rs
7223 views
use core::{any::type_name, marker::PhantomData};12use bevy_app::{Plugin, PreUpdate};3use bevy_diagnostic::{Diagnostic, DiagnosticPath, Diagnostics, RegisterDiagnostic};4use bevy_ecs::{resource::Resource, system::Res};5use bevy_platform::sync::atomic::{AtomicUsize, Ordering};67use crate::{8render_asset::{RenderAsset, RenderAssets},9Extract, ExtractSchedule, RenderApp,10};1112pub struct RenderAssetDiagnosticPlugin<A: RenderAsset> {13suffix: &'static str,14_phantom: PhantomData<A>,15}1617impl<A: RenderAsset> RenderAssetDiagnosticPlugin<A> {18pub fn new(suffix: &'static str) -> Self {19Self {20suffix,21_phantom: PhantomData,22}23}2425pub fn render_asset_diagnostic_path() -> DiagnosticPath {26DiagnosticPath::from_components(["render_asset", type_name::<A>()])27}28}2930impl<A: RenderAsset> Plugin for RenderAssetDiagnosticPlugin<A> {31fn build(&self, app: &mut bevy_app::App) {32app.register_diagnostic(33Diagnostic::new(Self::render_asset_diagnostic_path()).with_suffix(self.suffix),34)35.init_resource::<RenderAssetMeasurements<A>>()36.add_systems(PreUpdate, add_render_asset_measurement::<A>);3738if let Some(render_app) = app.get_sub_app_mut(RenderApp) {39render_app.add_systems(ExtractSchedule, measure_render_asset::<A>);40}41}42}4344#[derive(Debug, Resource)]45struct RenderAssetMeasurements<A: RenderAsset> {46assets: AtomicUsize,47_phantom: PhantomData<A>,48}4950impl<A: RenderAsset> Default for RenderAssetMeasurements<A> {51fn default() -> Self {52Self {53assets: AtomicUsize::default(),54_phantom: PhantomData,55}56}57}5859fn add_render_asset_measurement<A: RenderAsset>(60mut diagnostics: Diagnostics,61measurements: Res<RenderAssetMeasurements<A>>,62) {63diagnostics.add_measurement(64&RenderAssetDiagnosticPlugin::<A>::render_asset_diagnostic_path(),65|| measurements.assets.load(Ordering::Relaxed) as f64,66);67}6869fn measure_render_asset<A: RenderAsset>(70measurements: Extract<Res<RenderAssetMeasurements<A>>>,71assets: Res<RenderAssets<A>>,72) {73measurements74.assets75.store(assets.iter().count(), Ordering::Relaxed);76}777879