From 71dfd5a1e4ed7f1dd2fc3dfcd10cded1eb29c08b Mon Sep 17 00:00:00 2001 From: Aevyrie Date: Sat, 17 Feb 2024 21:12:43 -0800 Subject: [PATCH 1/5] Bevy 0.13 (#52) * Updates for Bevy main (will become 0.13) * bump to bevy 0.13 * bump version * update readme * fix docs --------- Co-authored-by: Arend van Beelen jr --- Cargo.toml | 6 +++--- README.md | 1 + examples/demo.rs | 2 +- src/debug.rs | 28 +++++++++++----------------- 4 files changed, 16 insertions(+), 21 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 10b607b..a13774b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "bevy_framepace" -version = "0.14.1" +version = "0.15.0" edition = "2021" resolver = "2" description = "Frame pacing and frame limiting for Bevy" @@ -11,7 +11,7 @@ documentation = "https://docs.rs/bevy_framepace" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -bevy = { version = "0.12", default-features = false, features = [ +bevy = { version = "0.13", default-features = false, features = [ "bevy_render", "bevy_winit", ] } @@ -22,7 +22,7 @@ default = ["framepace_debug", "bevy/x11"] framepace_debug = [] [dev-dependencies] -bevy = { version = "0.12", default-features = false, features = [ +bevy = { version = "0.13", default-features = false, features = [ "bevy_gizmos", "bevy_text", "bevy_ui", diff --git a/README.md b/README.md index 122a10d..2e0f0d2 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,7 @@ I intend to track the `main` branch of Bevy. PRs supporting this are welcome! | bevy | bevy_framepace | | ---- | ------------------- | +| 0.13 | 0.15 | | 0.12 | 0.14 | | 0.11 | 0.13 | | 0.10 | 0.12 | diff --git a/examples/demo.rs b/examples/demo.rs index 4161003..64a9850 100644 --- a/examples/demo.rs +++ b/examples/demo.rs @@ -18,7 +18,7 @@ struct EnableText; fn toggle_plugin( mut settings: ResMut, - input: Res>, + input: Res>, ) { if input.just_pressed(KeyCode::Space) { use bevy_framepace::Limiter; diff --git a/src/debug.rs b/src/debug.rs index 84f4e52..51204c1 100644 --- a/src/debug.rs +++ b/src/debug.rs @@ -1,7 +1,7 @@ //! Adds diagnostic logging and a cursor for debugging. use bevy::{ - diagnostic::{Diagnostic, DiagnosticId, Diagnostics, RegisterDiagnostic}, + diagnostic::{Diagnostic, DiagnosticPath, Diagnostics, RegisterDiagnostic}, prelude::*, }; @@ -12,24 +12,18 @@ impl Plugin for DiagnosticsPlugin { fn build(&self, app: &mut App) { app.add_systems(Update, Self::diagnostic_system); - app.register_diagnostic( - Diagnostic::new(Self::FRAMEPACE_FRAMETIME, "framepace::frametime", 128) - .with_suffix("ms"), - ); - app.register_diagnostic( - Diagnostic::new(Self::FRAMEPACE_OVERSLEEP, "framepace::oversleep", 128) - .with_suffix("µs"), - ); + app.register_diagnostic(Diagnostic::new(Self::FRAMEPACE_FRAMETIME).with_suffix("ms")); + app.register_diagnostic(Diagnostic::new(Self::FRAMEPACE_OVERSLEEP).with_suffix("µs")); } } impl DiagnosticsPlugin { - /// [`DiagnosticId`] for the frametime - pub const FRAMEPACE_FRAMETIME: DiagnosticId = - DiagnosticId::from_u128(8021378406439507683279787892187089153); - /// [`DiagnosticId`] for failures to meet frame time target - pub const FRAMEPACE_OVERSLEEP: DiagnosticId = - DiagnosticId::from_u128(978023490268634078905367093342937); + /// [`DiagnosticPath`] for the frametime + pub const FRAMEPACE_FRAMETIME: DiagnosticPath = + DiagnosticPath::const_new("framepace/frametime"); + /// [`DiagnosticPath`] for failures to meet frame time target + pub const FRAMEPACE_OVERSLEEP: DiagnosticPath = + DiagnosticPath::const_new("framepace/oversleep"); /// Updates diagnostic data from measurements pub fn diagnostic_system( @@ -44,7 +38,7 @@ impl DiagnosticsPlugin { let frametime_millis = stats.frametime.try_lock().unwrap().as_secs_f64() * 1_000_f64; let error_micros = stats.oversleep.try_lock().unwrap().as_secs_f64() * 1_000_000_f64; - diagnostics.add_measurement(Self::FRAMEPACE_FRAMETIME, || frametime_millis); - diagnostics.add_measurement(Self::FRAMEPACE_OVERSLEEP, || error_micros); + diagnostics.add_measurement(&Self::FRAMEPACE_FRAMETIME, || frametime_millis); + diagnostics.add_measurement(&Self::FRAMEPACE_OVERSLEEP, || error_micros); } } From 11e35493a3a37183b08712ff036a13c51e9cf32b Mon Sep 17 00:00:00 2001 From: Aevyrie Date: Sun, 3 Mar 2024 16:13:30 -0800 Subject: [PATCH 2/5] Dependency reduction (#53) * Updates for Bevy main (will become 0.13) * Update deps * Fix features * enable winit x11 by default * fix docs --------- Co-authored-by: Arend van Beelen jr --- Cargo.toml | 28 +++++++++++++++++++++++----- src/debug.rs | 8 ++++---- src/lib.rs | 22 ++++++++++++---------- 3 files changed, 39 insertions(+), 19 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a13774b..ffdd421 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,14 +11,21 @@ documentation = "https://docs.rs/bevy_framepace" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -bevy = { version = "0.13", default-features = false, features = [ - "bevy_render", - "bevy_winit", -] } +bevy_app = "0.13" +bevy_ecs = "0.13" +bevy_diagnostic = "0.13" +bevy_log = "0.13" +bevy_render = "0.13" +bevy_reflect = "0.13" +bevy_time = "0.13" +bevy_utils = "0.13" +bevy_window = "0.13" +bevy_winit = "0.13" +# Non-bevy spin_sleep = "1.0" [features] -default = ["framepace_debug", "bevy/x11"] +default = ["framepace_debug", "bevy_winit/x11"] framepace_debug = [] [dev-dependencies] @@ -28,4 +35,15 @@ bevy = { version = "0.13", default-features = false, features = [ "bevy_ui", "default_font", "multi-threaded", + "x11", ] } + +[[example]] +name = "demo" +path = "examples/demo.rs" +required-features = ["default"] + +[[example]] +name = "minimal" +path = "examples/minimal.rs" +required-features = ["default"] diff --git a/src/debug.rs b/src/debug.rs index 51204c1..13bcc46 100644 --- a/src/debug.rs +++ b/src/debug.rs @@ -1,9 +1,9 @@ //! Adds diagnostic logging and a cursor for debugging. -use bevy::{ - diagnostic::{Diagnostic, DiagnosticPath, Diagnostics, RegisterDiagnostic}, - prelude::*, -}; +use bevy_app::prelude::*; +use bevy_diagnostic::{Diagnostic, DiagnosticPath, Diagnostics, RegisterDiagnostic}; +use bevy_ecs::prelude::*; +use bevy_time::prelude::*; /// Adds [`Diagnostics`] data from `bevy_framepace` pub struct DiagnosticsPlugin; diff --git a/src/lib.rs b/src/lib.rs index fa65274..a37600e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,4 @@ -//! This is a [`bevy`] plugin that adds framepacing and framelimiting to improve input latency and +//! This is a `bevy` plugin that adds framepacing and framelimiting to improve input latency and //! power use. //! //! # How it works @@ -27,13 +27,15 @@ #![deny(missing_docs)] +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use bevy_reflect::prelude::*; +use bevy_render::{pipelined_rendering::RenderExtractApp, Render, RenderApp, RenderSet}; +use bevy_utils::Instant; +use bevy_window::prelude::*; + #[cfg(not(target_arch = "wasm32"))] -use bevy::winit::WinitWindows; -use bevy::{ - prelude::*, - render::{pipelined_rendering::RenderExtractApp, RenderApp, RenderSet}, - utils::Instant, -}; +use bevy_winit::WinitWindows; use std::{ sync::{Arc, Mutex}, @@ -78,7 +80,7 @@ impl Plugin for FramepacePlugin { .insert_resource(limit) .insert_resource(stats) .add_systems( - bevy::render::Render, + Render, framerate_limiter .in_set(RenderSet::Cleanup) .after(World::clear_entities), @@ -199,7 +201,7 @@ fn get_display_refresh_rate( Limiter::Off => { #[cfg(feature = "framepace_debug")] if settings.is_changed() { - info!("Frame limiter disabled"); + bevy_log::info!("Frame limiter disabled"); } return; } @@ -208,7 +210,7 @@ fn get_display_refresh_rate( if let Ok(mut limit) = frame_limit.0.try_lock() { if new_frametime != *limit { #[cfg(feature = "framepace_debug")] - info!("Frametime limit changed to: {:?}", new_frametime); + bevy_log::info!("Frametime limit changed to: {:?}", new_frametime); *limit = new_frametime; } } From 75b569a520237a8138aead9885a8b538843ae4fd Mon Sep 17 00:00:00 2001 From: Tim Date: Fri, 5 Apr 2024 14:58:21 +0200 Subject: [PATCH 3/5] Add wasm32 workaround for missing `pipelined_rendering` The `pipelined_rendering` export is no longer available in Bevy since version 0.12 in wasm32 builds; it can no longer be used to select the right subapp. Add a dummy version of the `AppLabel` that targets the `pipelined_rendering` subapp. Using a dummy app label allows to keep the same code to get the right subapp to apply the framepace resources and systems. --- src/lib.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index a37600e..39145e8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -30,10 +30,12 @@ use bevy_app::prelude::*; use bevy_ecs::prelude::*; use bevy_reflect::prelude::*; -use bevy_render::{pipelined_rendering::RenderExtractApp, Render, RenderApp, RenderSet}; +use bevy_render::{Render, RenderApp, RenderSet}; use bevy_utils::Instant; use bevy_window::prelude::*; +#[cfg(not(target_arch = "wasm32"))] +use bevy_render::pipelined_rendering::RenderExtractApp; #[cfg(not(target_arch = "wasm32"))] use bevy_winit::WinitWindows; @@ -45,6 +47,11 @@ use std::{ #[cfg(feature = "framepace_debug")] pub mod debug; +/// A dummy label for the subapp of the rendered pipeline that does not exist in wasm32 +#[cfg(target_arch = "wasm32")] +#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, bevy_app::AppLabel)] +struct RenderExtractApp; + /// Adds framepacing and framelimiting functionality to your [`App`]. #[derive(Debug, Clone, Component)] pub struct FramepacePlugin; From 4f7a18c66c433192c4d186ed04ebf6de89698de9 Mon Sep 17 00:00:00 2001 From: Aevyrie Date: Fri, 7 Jun 2024 22:55:14 -0700 Subject: [PATCH 4/5] Create FUNDING.yml --- .github/FUNDING.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..7f3456a --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,3 @@ +# These are supported funding model platforms + +github: aevyrie From eac676b3dca6e227239ec950e42a68cd19185a5d Mon Sep 17 00:00:00 2001 From: Aevyrie Date: Tue, 11 Jun 2024 22:04:49 -0700 Subject: [PATCH 5/5] Cleanup, fix warnings --- src/lib.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 39145e8..fdeb17b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -32,11 +32,12 @@ use bevy_ecs::prelude::*; use bevy_reflect::prelude::*; use bevy_render::{Render, RenderApp, RenderSet}; use bevy_utils::Instant; -use bevy_window::prelude::*; #[cfg(not(target_arch = "wasm32"))] use bevy_render::pipelined_rendering::RenderExtractApp; #[cfg(not(target_arch = "wasm32"))] +use bevy_window::prelude::*; +#[cfg(not(target_arch = "wasm32"))] use bevy_winit::WinitWindows; use std::{ @@ -47,7 +48,8 @@ use std::{ #[cfg(feature = "framepace_debug")] pub mod debug; -/// A dummy label for the subapp of the rendered pipeline that does not exist in wasm32 +/// Bevy does not export `RenderExtractApp` on wasm32, so we create a dummy label to ensure this +/// compiles on wasm32. #[cfg(target_arch = "wasm32")] #[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, bevy_app::AppLabel)] struct RenderExtractApp; @@ -124,6 +126,7 @@ struct FramepaceSettingsProxy { limiter: Arc>, } +#[cfg(not(target_arch = "wasm32"))] impl FramepaceSettingsProxy { fn is_enabled(&self) -> bool { self.limiter.try_lock().iter().any(|l| l.is_enabled()) @@ -258,6 +261,7 @@ pub struct FramePaceStats { /// `spin_sleep` sleeps as long as possible given the platform's sleep accuracy, and spins for the /// remainder. The dependency is however not WASM compatible, which is fine, because frame limiting /// should not be used in a browser; this would compete with the browser's frame limiter. +#[allow(unused_variables)] fn framerate_limiter( mut timer: ResMut, target_frametime: Res,