From 55e74ea8e9964cfdf73e58bfd5a10cc57b63aae0 Mon Sep 17 00:00:00 2001 From: irate Date: Thu, 16 Nov 2023 22:50:17 +0100 Subject: [PATCH] Revert `App::run()` behavior/Remove `winit` specific code from `bevy_app` (#10389) # Objective The way `bevy_app` works was changed unnecessarily in #9826 whose changes should have been specific to `bevy_winit`. I'm somewhat disappointed that happened and we can see in https://github.com/bevyengine/bevy/pull/10195 that it made things more complicated. Even worse, in #10385 it's clear that this breaks the clean abstraction over another engine someone built with Bevy! Fixes #10385. ## Solution - Move the changes made to `bevy_app` in #9826 to `bevy_winit` - Revert the changes to `ScheduleRunnerPlugin` and the `run_once` runner in #10195 as they're no longer necessary. While this code is breaking relative to `0.12.0`, it reverts the behavior of `bevy_app` back to how it was in `0.11`. Due to the nature of the breakage relative to `0.11` I hope this will be considered for `0.12.1`. --- crates/bevy_app/src/app.rs | 26 ++++++-------------------- crates/bevy_app/src/schedule_runner.rs | 7 +------ crates/bevy_winit/src/lib.rs | 8 ++++++++ 3 files changed, 15 insertions(+), 26 deletions(-) diff --git a/crates/bevy_app/src/app.rs b/crates/bevy_app/src/app.rs index 821612a23214e..296ab0c7c4178 100644 --- a/crates/bevy_app/src/app.rs +++ b/crates/bevy_app/src/app.rs @@ -309,14 +309,6 @@ impl App { panic!("App::run() was called from within Plugin::build(), which is not allowed."); } - if app.plugins_state() == PluginsState::Ready { - // If we're already ready, we finish up now and advance one frame. - // This prevents black frames during the launch transition on iOS. - app.finish(); - app.cleanup(); - app.update(); - } - let runner = std::mem::replace(&mut app.runner, Box::new(run_once)); (runner)(app); } @@ -986,20 +978,14 @@ impl App { } fn run_once(mut app: App) { - let plugins_state = app.plugins_state(); - if plugins_state != PluginsState::Cleaned { - while app.plugins_state() == PluginsState::Adding { - #[cfg(not(target_arch = "wasm32"))] - bevy_tasks::tick_global_task_pools_on_main_thread(); - } - app.finish(); - app.cleanup(); + while app.plugins_state() == PluginsState::Adding { + #[cfg(not(target_arch = "wasm32"))] + bevy_tasks::tick_global_task_pools_on_main_thread(); } + app.finish(); + app.cleanup(); - // if plugins where cleaned before the runner start, an update already ran - if plugins_state != PluginsState::Cleaned { - app.update(); - } + app.update(); } /// An event that indicates the [`App`] should exit. This will fully exit the app process at the diff --git a/crates/bevy_app/src/schedule_runner.rs b/crates/bevy_app/src/schedule_runner.rs index 18b2f0b61fb55..1e17f8322a5ee 100644 --- a/crates/bevy_app/src/schedule_runner.rs +++ b/crates/bevy_app/src/schedule_runner.rs @@ -84,12 +84,7 @@ impl Plugin for ScheduleRunnerPlugin { let mut app_exit_event_reader = ManualEventReader::::default(); match run_mode { - RunMode::Once => { - // if plugins where cleaned before the runner start, an update already ran - if plugins_state != PluginsState::Cleaned { - app.update(); - } - } + RunMode::Once => app.update(), RunMode::Loop { wait } => { let mut tick = move |app: &mut App, wait: Option| diff --git a/crates/bevy_winit/src/lib.rs b/crates/bevy_winit/src/lib.rs index 91c9858c79293..2291f609d0dea 100644 --- a/crates/bevy_winit/src/lib.rs +++ b/crates/bevy_winit/src/lib.rs @@ -349,6 +349,14 @@ impl Default for WinitAppRunnerState { /// Overriding the app's [runner](bevy_app::App::runner) while using `WinitPlugin` will bypass the /// `EventLoop`. pub fn winit_runner(mut app: App) { + if app.plugins_state() == PluginsState::Ready { + // If we're already ready, we finish up now and advance one frame. + // This prevents black frames during the launch transition on iOS. + app.finish(); + app.cleanup(); + app.update(); + } + let mut event_loop = app .world .remove_non_send_resource::>()